Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Meteor picker server side router use express middleware

I am trying to use express functions like res.send('string') or res.json(json) in my meteor rest api using the picker server side router. In the documentation, it says :

You can use existing connect and express middlewares without any issues.

How can I use express funtions like res.send and res.json ? When I try to use them, it tells me they are not a function.

I have the following main.js file for my server :

import { Meteor } from 'meteor/meteor';
import { Picker} from 'meteor/meteorhacks:picker';

var bodyParser = Meteor.npmRequire('body-parser'),
    methodOverride = Meteor.npmRequire('method-override'),
    logger = Meteor.npmRequire('morgan');

Picker.middleware(bodyParser.json());
Picker.middleware(bodyParser.urlencoded({extended:false}));
Picker.middleware(logger('dev'));
Picker.middleware(methodOverride('X-HTTP-Method'));          // Microsoft
Picker.middleware(methodOverride('X-HTTP-Method-Override')); // Google/GData
Picker.middleware(methodOverride('X-Method-Override'));

Meteor.startup(() => {
    console.log('meteor server started');

    var postRoutes = Picker.filter(function(req, res) {
        return req.method == "POST";
    });

    postRoutes.route('/post/:id', require('./routes/helloworld'));
});

And the following route action (routes/helloworld.js) :

function helloworld(params, req, res, next) {
    res.send('id:' + params.id); 
}

module.exports = helloworld;

I get the following error :

TypeError: res.send is not a function

It yells the same error when I try to use res.json...

packages.json :

{
    "body-parser": "1.15.2",
    "chai": "3.5.0",
    "chai-http": "3.0.0",
    "method-override": "2.3.6",
    "mocha": "3.0.2",
    "moment": "2.14.1",
    "moment-timezone": "0.5.5",
    "morgan": "1.7.0",
    "supertest": "2.0.0",
    "supertest-as-promised":"4.0.0",
    "express":"4.14.0"
}

UPDATE I found that I can mimic res.json with this code :

function helloworld(params, req, res, next) {
    console.log(req.body);
    res.setHeader( 'Content-Type', 'application/json' );
    res.end( JSON.stringify({id:params.id}) );
}

module.exports = helloworld;
like image 515
AlexB Avatar asked Nov 08 '22 10:11

AlexB


1 Answers

As Picker/Meteor is not using express, it does not have res.send() and res.json().

However, you can explore Restivus, which is a high level api wrapper which handle json automatically.

http://meteorpedia.com/read/REST_API#Restivus

Following is the sample code from above link:

if(Meteor.isServer) {
  Meteor.startup(function () {
    // Global configuration
    Api = new Restivus({
      version: 'v1',
      useDefaultAuth: true,
      prettyJson: true
    });

    // Generates: GET/POST on /api/v1/users, and GET/PUT/DELETE on /api/v1/users/:id 
    // for Meteor.users collection (works on any Mongo collection)
    Api.addCollection(Meteor.users);
    // That's it! Many more options are available if needed...

    // Maps to: POST /api/v1/articles/:id
    Api.addRoute('articles/:id', {authRequired: true}, {
      post: {
        roleRequired: ['author', 'admin'],
        action: function () {
          var article = Articles.findOne(this.urlParams.id);
          if (article) {
            return {status: "success", data: article};
          }
          return {
            statusCode: 400,
            body: {status: "fail", message: "Unable to add article"}
          };
        }
      }
    });
  });
}
like image 196
John Siu Avatar answered Nov 15 '22 06:11

John Siu