Nodejs,Express GET POST params

时间:2012-07-26 03:49:41

标签: javascript node.js express

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

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

POST如此:

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

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

THX,

2 个答案:

答案 0 :(得分:21)

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

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

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

3)身体参数,如果您使用req.body中间件,将在express.bodyParser中捕获。这些只会出现在Content-Type为“x-www-form-urlencoded”的POST请求中。

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

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

如果您不想使用图书馆并希望以自己的方式扩展对象,请查看this blog post

答案 1 :(得分:0)

Personnaly,我将req.paramsreq.bodyreq.query合并到一个req.props Object.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;
    });

现在,您可以在所有路线中轻松访问带有req.props的GET,POST,PUT参数,如果您决定删除旧请求,请注意相似名称。

此外,您可以使用中间件/功能使其更有用。

有关Object.assign()的更多信息:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign