我是新手Node/Express开发者.. 我发现可以通过以下方式捕获GET参数:
app.get('/log/:name', api.logfunc);
使用以下方式进行POST:
app.post('/log', ...
(表单变量在req.body中可用)。
我知道有app.all,但是当使用app.all时是否有一种方法可以获取所有GET和POST的变量?(我太习惯于php中的$ _REQUEST:)
谢谢,
我是新手Node/Express开发者.. 我发现可以通过以下方式捕获GET参数:
app.get('/log/:name', api.logfunc);
使用以下方式进行POST:
app.post('/log', ...
(表单变量在req.body中可用)。
我知道有app.all,但是当使用app.all时是否有一种方法可以获取所有GET和POST的变量?(我太习惯于php中的$ _REQUEST:)
谢谢,
您正在处理三种不同的参数传递方法:
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 || {}).
如果你不想使用库,而是想要自己扩展对象的方法,请看这篇博客文章。
req.param()
正是那样做的 - http://expressjs.com/api.html#req.param - Simon Smith个人而言,我会使用Object.assign()
将req.params
、req.body
和req.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
app.use(express.bodyParser())
,JSON.stringify(req.query)
用于get
请求,JSON.stringify(req.body)
用于post
请求。 - Jonathan Ong