Nodejs、Express GET POST 参数

10

我是新手Node/Express开发者.. 我发现可以通过以下方式捕获GET参数:

app.get('/log/:name', api.logfunc);

使用以下方式进行POST:

app.post('/log', ...(表单变量在req.body中可用)。

我知道有app.all,但是当使用app.all时是否有一种方法可以获取所有GET和POST的变量?(我太习惯于php中的$ _REQUEST:)

谢谢,


Assuming you app.use(express.bodyParser()), JSON.stringify(req.query) 用于get请求,JSON.stringify(req.body) 用于post请求。 - Jonathan Ong
2个回答

25

您正在处理三种不同的参数传递方法:

1)路径参数,当您在路由中使用冒号前缀组件或正则表达式捕获时,将在req.param中表示的路由器捕获。这些可以存在于GET和POST请求中。

2)URL查询字符串参数,如果使用express.query中间件,则将在req.query中捕获。这些也可以存在于GET和POST请求中。

3)Body参数,如果使用express.bodyParser中间件,则将在req.body中捕获。这些仅存在于具有“x-www-form-urlencoded”Content-Type的POST请求中。

因此,您需要将所有三个对象(如果存在)合并为一个。没有本地Object方法可以执行此操作,但有很多流行的解决方法。例如,underscore.js库定义了一个extend函数,允许您编写以下内容

req.params=_.extend(req.params || {}, req.query || {}, req.body || {}).

如果你不想使用库,而是想要自己扩展对象的方法,请看这篇博客文章


3
我相信 req.param() 正是那样做的 - http://expressjs.com/api.html#req.param - Simon Smith

0

个人而言,我会使用Object.assign()req.paramsreq.bodyreq.query合并成一个单一的对象req.props

在ES6中:

你只需要在你的路由中写入以下代码:

   app.all('/myroute/:myparam', (req, res, next) => {
        // merge all req data in one
        req.props = Object.assign(req.query, req.params, req.body);
        // optional :
        // delete req.query;
        // delete req.params;
        // delete req.body;
    });

在 ES5 中:

    app.all('/myroute/:myparam', function(req, res, next){
        // merge all req data in one
        req.props = {};
        if(req.query)  for (var attrname in req.query)  { req.props[attrname] = req.query[attrname]; }
        if(req.params) for (var attrname in req.params) { req.props[attrname] = req.params[attrname]; }
        if(req.body)   for (var attrname in req.body)   { req.props[attrname] = req.body[attrname]; }
        // optional :
        // delete req.query;
        // delete req.params;
        // delete req.body;
    });

现在,您可以在所有路由中使用req.props轻松访问GET、POST、PUT参数,请注意如果您决定删除旧的req,则要小心相似的名称。
此外,您可以编写中间件/函数使其更加有用。
关于Object.assign()的更多信息:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接