gpt4 book ai didi

node.js - 请求中没有发送 req.params

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:01 25 4
gpt4 key购买 nike

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

使用参数日志执行一条路由:在 {} 上执行查询,因此,根本不会捕获 req.params.bear_id,如果我通过 req.params.bears_id 更改 req.params,显然我会收到未定义的日志,因此我阅读了文档,并认为我在该过程中做得很好,但没有发现问题。

最佳答案

您没有在记录器中调用 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

关于node.js - 请求中没有发送 req.params,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25493078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com