[Node.js] 如何在Express中使用“?”後訪問GET參數?


Answers

更新: req.param()現在已被棄用,所以前進不要使用這個答案。

你的答案是這樣做的首選方式,但是我想我會指出你也可以通過req.param(parameterName, defaultValue)訪問url,post和路由參數。

在你的情況下:

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

從快遞指南:

查找按以下順序執行:

  • req.params
  • req.body
  • req.query

請注意本指南確實說明了以下內容:

直接訪問req.body,req.params和req.query應該清晰起見 - 除非您確實接受來自每個對象的輸入。

然而在實踐中,我已經發現req.param()足夠清晰,並且使某些類型的重構更容易。

Question

我知道如何獲得像這樣的查詢參數:

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

在這種情況下,我可以使用req.params.id來獲取參數(例如, 2 /sample/2 in /sample/2 )。

但是,對於像/sample/2?color=red這樣的url,我如何訪問變量color

我試過req.params.color但沒有奏效。




我開始使用express的一些應用程序的一個很好的技術是創建一個對象,該對象合併express的請求對象的查詢,參數和主體字段。

//./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);
});

這使得它可以“深入”用戶可能發送的所有“自定義數據”,並且方便地進行處理。

注意

為什麼'道具'字段? 因為這是一個精簡的片段,我在一些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.query來訪問QueryString。

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

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

});



@ Zugwait的答案是正確的。 req.param()已棄用。 你應該使用req.paramsreq.queryreq.body

但只是為了更清楚一點:

req.params將只填充路由值。 也就是說,如果您有像/users/:id這樣的路由,您可以在req.params.idreq.params['id']訪問該id

req.queryreq.body將填充所有參數,無論它們是否在路徑中。 當然,查詢字符串中的參數將在req.query可用,並且後一主體中的參數將在req.body可用。

所以,回答你的問題,因為color不在路線中,你應該可以使用req.query.colorreq.query['color']來獲取它。