【问题标题】:no req.params sent in the requests请求中没有发送 req.params
【发布时间】:2014-10-19 00:38:26
【问题描述】:

在一个实践示例中,我正在尝试创建一个 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

上面是简单的配置,下面是给我带来问题的 sn-p:

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

使用参数记录我执行一条路线:executing query on {},因此,req.params.bear_id 根本没有被捕获,如果我通过 req.params.bears_id 更改 req.params,显然我得到一个未定义的日志,所以我阅读了 de docs 并认为我在这个过程中做得很好,但没有发现问题。

【问题讨论】:

    标签: node.js rest express routes


    【解决方案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();
    });
    

    现在您在记录器中看不到参数的原因是因为参数仅在路由定义具有参数时才可见。您的记录器中间件没有定义特定的路由,因此没有参数。一个解决方案是使用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

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2020-01-25
      • 1970-01-01
      • 2020-02-08
      • 2011-05-18
      • 2021-11-16
      • 2014-12-01
      • 2020-02-10
      • 2019-07-27
      相关资源
      最近更新 更多