我知道如何获取查询的参数,像这样:

app.get('/sample/:id', routes.sample);

在这种情况下,我可以使用req.params.id来获取参数(例如/sample/2中的2)。

然而,对于/sample/2这样的url ?color=红色,我怎么能访问变量颜色?

我试过req.params.color,但不起作用。


当前回答

快捷手册上说你应该用req。query来访问QueryString。

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {

  var isSmall = req.query.size === 'small'; // > true
  // ...

});

其他回答

因此,在检出express引用之后,我发现req.query.color将返回我正在寻找的值。

要求的事情。params指的是URL和req中带有“:”的项。查询引用与'?'相关的项

例子:

GET /something?color1=red&color2=blue

然后在express中,处理程序:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

我已经开始在express上的一些应用程序中使用的一个很好的技术是创建一个对象,它合并了express的request对象的查询、params和body字段。

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

然后在你的控制器体中,或者在快速请求链的范围内的任何地方,你可以像下面这样使用:

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

这使得“深入”用户可能发出的请求的所有“自定义数据”变得很好和方便。

Note

为什么是“道具”领域?因为这是一个精简的代码片段,我在我的许多api中使用了这种技术,我还将身份验证/授权数据存储在这个对象上,示例如下。

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);

        //Store reference to the user
        this.user = req.user || null;

        //API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
        this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
    }
} 

更新:req.param()现在已弃用,所以以后不要使用这个答案。


你的答案是首选的方式,但我想我要指出,你也可以访问url, post和路由参数都与req。参数(parameterName defaultValue)。

在你的情况下:

var color = req.param('color');

速递指南:

查找的顺序如下: req.params req.body req.query

注意,指南中有如下规定:

直接访问请求。身体,点播。Params和req。查询应该是 有利于清晰-除非你真正接受来自每个对象的输入。

然而,在实践中,我发现req.param()已经足够清晰,并使某些类型的重构更容易。

只需使用app.get:

app.get('/some/page/here', (req, res) => {
    console.log(req.query.color) // Your color value will be displayed
})

你可以在expressjs.com的文档api上看到: http://expressjs.com/en/api.html

使用要求。查询,用于获取路由中查询字符串参数中的值。 参考req.query。 如果在路由http://localhost:3000/?name=satyam中,你想获取name参数的值,那么你的“get”路由处理程序将像这样:-

app.get('/', function(req, res){
    console.log(req.query.name);
    res.send('Response send to client::'+req.query.name);

});