8

我是 Node/Express 的新手。我看到 GET 参数可以像这样被捕获:

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

像这样发布:

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

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

谢谢,

4

2 回答 2

23

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

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

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

req.body3)正文参数,如果使用express.bodyParser中间件,将被捕获。这些只会出现在具有Content-Type“x-www-form-urlencoded”的 POST 请求中。

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

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

如果您不想使用库并想使用自己的方式扩展对象,请查看此博客文章

于 2012-07-26T06:16:09.907 回答
0

个人而言,我将req.params, req.body,合并req.query到一个对象req.propsObject.assign()

在 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;
    });

Now, you can access easily to your GET, POST, PUT params with req.props in all your routes, be careful about similars name if you decide to delete the old req.

Also, you can do a middleware/functions to make it more useful yet.

More about Object.assign(): https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign

于 2017-10-30T06:03:34.117 回答