Express中间件没有效果

时间:2014-02-20 16:37:07

标签: javascript node.js express

我有以下代码:

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。知道我做错了吗?

感谢。

4 个答案:

答案 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.paramsArray的一个实例,并且默认机制试图将一个数组放入字符串中,这会给你{{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.0req.params是一个对象而不是一个数组,所以你不应该有类似的问题使用v4.0.0,您的代码应该按预期工作。

req.params

答案 3 :(得分:0)

问题不在于您的中间件。 bodyParser和cookieParser都不提供命名的url参数解析。话虽这么说,你的代码对我来说是正确的。您是否确定在更改代码后重新启动了节点服务器?