我有以下代码:
var express = require('express');
var app = express();
app.use(express.bodyParser());
app.use(express.cookieParser());
var port = Number(process.env.PORT || 5000);
app.get('/test/:id', function(req, res) {
res.send(req.params);
});
app.listen(port);
console.log("Listening on port " + port);
当我在浏览器中点击http://localhost:5000/test/12345
时,我看到:
[]
但我希望看到填充的req.params对象id: 12345
。知道我做错了吗?
感谢。
答案 0 :(得分:3)
检查并发现req.params实际上是一个关联数组,它几乎与对象相似但不完全相似。不确定为什么明确定义它。它获得的唯一好处是增加了数组的长度属性。 res.send将尝试JSON.stringify您的输出,反过来将看到它是一个数组,只处理数字索引。因此,空[]为返回值。
您可以通过执行 -
来验证这一点var myParams = {};
Object.keys(req.params).forEach(function(key){
myParams[key] = req.params[key];
});
res.send(myParams);
您还可以通过定义路线来看到JSON.stringify只关心数字索引 -
app.get('/test/:0', function(req, res) {
res.send(req.params);
});
答案 1 :(得分:1)
响应对象将以id
命名。如果您在浏览器的流量中进行检查,则可以看到名为12345
的文件。虽然您可以通过在服务器端登录来检查您的服务器是否获得了id。
app.get('/test/:id', function(req, res) {
console.log(req.params);
res.send(req.params);
});
如果要将变量传递给视图,可能需要使用res.render(...)
函数来传递参数。
要让123451
发送res.send(req.params.id);
。
答案 2 :(得分:1)
你没有使用res.send(req.params)
获取任何内容的原因是因为req.params
是Array
的一个实例,并且默认机制试图将一个数组放入字符串中,这会给你{{1 }}
你可以做些什么来查看所有参数如下:
[]
这将为您提供输出(使用此网址app.get('/test/:id', function(req, res) {
res.send(require('util').inspect(req.params));
});
):
http://localhost:5000/test/12345
该方法也适用于具有更多参数的路线,例如以下代码段和请求[ id: '12345' ]
http://localhost:5000/test/name/234
会给你:
app.get('/test/:name/:id', function(req, res) {
res.send(require('util').inspect(req.params));
});
或者,如果您希望获得JavaScript对象的JSON格式输出,则可以使用[ name: 'name', id: '234' ]
。但请注意,res.json
如果您执行json
,也会生成[]
,因为它会以标准方式呈现res.json(req.params)
数组。
我希望这会有所帮助。
注意从 2014年4月9日开始(Express version 4.0.0)req.params
是一个对象而不是一个数组,所以你不应该有类似的问题使用v4.0.0,您的代码应该按预期工作。
req.params
答案 3 :(得分:0)
问题不在于您的中间件。 bodyParser和cookieParser都不提供命名的url参数解析。话虽这么说,你的代码对我来说是正确的。您是否确定在更改代码后重新启动了节点服务器?