在请求中没有发送req.params

时间:2014-08-25 19:33:45

标签: node.js rest express routes

在一个练习示例中,我试图创建一个restfull API,非常简单。普通的GET和POST方法运行良好,但指向/ api / bears /:bear_id的GET,PUT和DELETE方法只是停留在那里,等待......

// CONFIGURACION INICIAL //
// ===================== //
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var db = mongoose.connection;

// CONFIGURANDO APP //
// ================ //
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

mongoose.connect('mongodb://localhost:27017/bears');
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function cb () {
  console.log('conexion establecida');
})

var Bear = require('./models/bear_model.js');

var port = process.env.PORT || 8080;      // seteo del puerto

var router = express.Router();          // instancia del ruteador

上面是简单的配置,下面是导致我出现问题的代码段:

router.use(function (req, res, next) { // simple logger
  if (req.method === 'GET')
    console.log('executing query on id %s', JSON.stringify(req.params));
  else if (req.method === 'PUT')
    console.log('executing query on id %s', JSON.stringify(req.params));
  else
    console.log('executing query on id %s', JSON.stringify(req.params));
});

router.route('/bears/:bear_id')

  .get(function (req, res) {

    Bear.findById(req.params.bear_id, function (err, bear) {
      if (err)
        res.send(err);
      res.json(bear);
    });
  }) // end GET /bears/:bear_id

  .put(function (req, res) {

    Bear.findById(req.params.bear_id, function (err, bear) {
      if (err)
        res.send(err)

      bear.name = req.body.name; // Update bear_id of Bear

      bear.save(function (err) {
        if (err)
          res.send(err);

        res.json({msg: 'Bear actualizado!'});
      });
    });
  }) // end PUT /bears/:bear_id

  .delete(function (req, res) {

    Bear.remove({
      _id: req.params.bear_id
    }, function (err, bear) {
      if (err)
        res.send(err);
      res.json({ msg: 'Bear eliminado' });
    });
  }); // end DELETE /bears/:id && router /bears/:id

app.use('/api', router);               // la api usará como base el prefijo /api

使用param执行一个路由记录我:executing query on {},所以,req.params.bear_id根本没有捕获,如果我通过req.params.bears_id更改req.params,显然我得到一个未定义的记录,所以我读了de docs并认为我在这个过程中做得很好但是没有抓住这个问题。

1 个答案:

答案 0 :(得分:1)

您没有在记录器中拨打next(),因此您永远无法访问路由器,导致无法响应。

router.use(function (req, res, next) { // simple logger
  if (req.method === 'GET')
    console.log('executing query on id %s', JSON.stringify(req.params));
  else if (req.method === 'PUT')
    console.log('executing query on id %s', JSON.stringify(req.params));
  else
    console.log('executing query on id %s', JSON.stringify(req.params));
  next();
});

现在您没有在记录器中看到params的原因是因为仅当路径定义具有参数时,params才可见。您的记录器中间件没有定义特定路由,因此没有参数。对此的解决方案是使用Router.param

router.param('bear_id', function(req, res, next, bear_id) {
  if (req.method === 'GET')
    console.log('executing query on id ' + bear_id);
  else if (req.method === 'PUT')
    console.log('executing query on id ' + bear_id);
  else
    console.log('executing query on id ' + bear_id);
  next();
});

更简单:

router.param('bear_id', function(req, res, next, bear_id) {
   console.log(req.method + ' with id ' + bear_id);
   next();
});

这是通过设计这种方式工作,你可以在github上找到更多信息: https://github.com/strongloop/express/issues/2088