620

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

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

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

但是,对于 url 之类的/sample/2?color=red,我如何访问变量color

我试过req.params.color了,但没有用。

4

10 回答 10

928

So, after checking out the express reference, I found that req.query.color would return me the value I'm looking for.

req.params refers to items with a ':' in the URL and req.query refers to items associated with the '?'

Example:

GET /something?color1=red&color2=blue

Then in express, the handler:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})
于 2013-06-09T08:56:28.407 回答
91

使用 req.query,获取路由中查询字符串参数中的值。请参阅req.query。假设如果在路由中,http://localhost:3000/?name=satyam您想获取 name 参数的值,那么您的“获取”路由处理程序将如下所示:-

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

});
于 2016-08-28T17:00:55.463 回答
73

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


您的回答是首选方法,但是我想我想指出您还可以使用req.param(parameterName, defaultValue).

在你的情况下:

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

来自快速指南:

查找按以下顺序执行:

  • 请求参数
  • 请求正文
  • 请求查询

请注意,该指南确实说明了以下内容:

为清楚起见,应优先使用对 req.body、req.params 和 req.query 的直接访问 - 除非您真正接受来自每个对象的输入。

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

于 2014-09-22T15:27:18.243 回答
71

查询字符串和参数不同。

您需要在单个路由 url 中同时使用两者

请检查以下示例可能对您有用。

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')

  ................

});

获取传递第二段的链接是您的 id 示例:http://localhost:port/sample/123

如果您遇到问题,请使用“?”作为查询字符串传递变量 操作员

  app.get('/sample', function(req, res) {

     var id = req.query.id; 

      ................

    });

获取您喜欢的链接示例:http://localhost:port/sample?id=123

两者都在一个例子中

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')
 var id2 = req.query.id; 
  ................

});

获取链接示例:http://localhost:port/sample/123?id=123

于 2016-07-05T10:54:52.300 回答
48

@Zugwait 的回答是正确的。req.param()已弃用。您应该使用req.params,req.queryreq.body.

但只是为了更清楚:

req.params将仅填充路由值。也就是说,如果您有类似 的路线/users/:id,则可以访问idinreq.params.idreq.params['id'].

req.query并将req.body填充所有参数,无论它们是否在路线中。当然,查询字符串中的参数将在 中可用,req.query而帖子正文中的参数将在req.body.

因此,回答您的问题,因为color不在路线中,您应该能够使用req.query.coloror获得它req.query['color']

于 2015-08-02T16:56:21.180 回答
18

快速手册说您应该使用req.query来访问 QueryString。

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

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

});
于 2016-02-29T14:53:05.567 回答
7
const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')

const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  usersNdJobs()
    .then((users) => {
      res.render('users', { users })
    })
    .catch(console.error)
})

app.get('/api/company/users', (req, res) => {
  const companyname = req.query.companyName
  console.log(companyname)
  userByJob(companyname)
    .then((users) => {
      res.render('job', { users })
    }).catch(console.error)
})

app.post('/api/users/add', (req, res) => {
  const userName = req.body.userName
  const jobName = req.body.jobName
  console.log("user name = "+userName+", job name : "+jobName)
  addUser(userName, jobName)
    .then((result) => {
      res.status(200).json(result)
    })
    .catch((error) => {
      res.status(404).json({ 'message': error.toString() })
    })
})
app.post('/users/add', (request, response) => {
  const { userName, job } = request.body
  addTeam(userName, job)
  .then((user) => {
    response.status(200).json({
      "userName": user.name,
      "city": user.job
    })
  .catch((err) => {
    request.status(400).json({"message": err})
  })
})

app.post('/api/user/company/add', (req, res) => {
  const userName = req.body.userName
  const companyName = req.body.companyName
  console.log(userName, companyName)
  addUserToCompany(userName, companyName)
  .then((result) => {
    res.json(result)
  })
  .catch(console.error)
})

app.get('/api/company/user', (req, res) => {
 const companyname = req.query.companyName
 console.log(companyname)
 userByJob(companyname)
 .then((users) => {
   res.render('jobs', { users })
 })
})

app.listen(3000, () =>
  console.log('Example app listening on port 3000!')
)
于 2018-01-26T04:32:55.413 回答
3

您可以简单地使用req.query获取查询参数:

app.get('/', (req, res) => {
    let color1 = req.query.color1
    let color2 = req.query.color2
})

url模块提供用于 URL 解析和解析的实用程序。不使用 Express 的 URL 解析:

const url = require('url');
const queryString = require('querystring');

let rawUrl = 'https://stackoverflow.com/?page=2&size=3';

let parsedUrl = url.parse(rawUrl);
let parse = queryString.parse(parsedUrl.query);

// parse = { page: '2', size: '3' }

另一种方式:

const url = require('url');

app.get('/', (req, res) => {
  const queryObject = url.parse(req.url,true).query;
});

url.parse(req.url,true).query返回{ color1: 'red', color2: 'green' }.
url.parse(req.url,true).host返回'localhost:8080'.
url.parse(req.url,true).search返回 '?color1=red&color2=green'。

于 2021-09-12T18:08:30.590 回答
3

我开始在 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";
    }
} 
于 2017-10-09T08:51:29.787 回答
3

只需使用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

于 2021-09-12T18:13:13.983 回答