如何在“?”之后访问GET参数?在快递?


526

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

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

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

但是,对于url like /sample/2?color=red,如何访问变量color

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

Answers:


775

因此,在检查了明确的参考文献之后,我发现这req.query.color将返回我想要的值。

req.params是指URL中带有“:”的项目,而req.query是指与“?”相关的项目。

例:

GET /something?color1=red&color2=blue

然后,快递员:

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

您能告诉我如何验证“ id”吗?
阿南·拉吉

1
@AnandRaj:您是什么意思:如何验证“ id”?您想要哪种验证?顺便说一句,您可以id像这样获得函数中的值:var sampleId = req.params.id;
Jochem Schulenklopper '17

4
req.params.whatever在最新版本中使用。
adelriosantiago


81

使用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);

});

也许有关querystring的一些信息以获得完整的答案
Schuere

67

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


您的答案是执行此操作的首选方式,但是我想指出的是,您还可以通过以下方式访问url,post和route参数 req.param(parameterName, defaultValue)

在您的情况下:

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

从快速指南中:

查找按以下顺序执行:

  • 需求参数
  • 需求主体
  • 请求查询

请注意,该指南确实指出以下内容:

为了清楚起见,应该倾向于直接访问req.body,req.params和req.query-除非您真正接受每个对象的输入。

但是在实践中,我实际上已经req.param()很清楚了,并使某些类型的重构更加容易。


53

查询字符串和参数不同。

您需要在单个路由网址中同时使用

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

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


2
谢谢这个答案非常有帮助!
布鲁诺·塔瓦雷斯

44

@Zugwait的答案是正确的。req.param()不推荐使用。您应该使用req.paramsreq.queryreq.body

但只是为了使它更清楚:

req.params将仅使用路由值填充。也就是说,如果你有一个路线一样/users/:id,你可以访问id无论是在req.params.idreq.params['id']

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

因此,回答您的问题(color而不是在路线中),您应该可以使用req.query.color或来获取req.query['color']


17

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

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

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

});

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!')
)

7
感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是解决问题的好方法,适当的解释将大大提高其长期价值,对于其他类似问题的读者也将更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
iBug

2

我已开始在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";
    }
} 

1
这可能是一个坏主意,因为它使维护端点变得更加困难。您不再知道客户端将使用哪种方法来传递参数。
sdgfsdh

老实说,这实际上是此方法的主要优点之一,而不必知道字段来自何处。上面的ExpressData类充当桥梁,允许您模块化业务逻辑,将其从快速控制器路由中移开,即,您没有将“ req.query”,“ req.body”烘焙到代码中,这也使您的业​​务代码易于测试,完全不在快递范围之内。
李·布林德里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.