Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在“获取”之后访问GET参数&引用;快车?_Node.js_Express_Query String - Fatal编程技术网

Node.js 如何在“获取”之后访问GET参数&引用;快车?

Node.js 如何在“获取”之后访问GET参数&引用;快车?,node.js,express,query-string,Node.js,Express,Query String,我知道如何获取以下查询的参数: app.get('/sample/:id', routes.sample); 在这种情况下,我可以使用req.params.id获取参数(例如/sample/2中的2) 但是,对于像/sample/2?color=red这样的url,如何访问变量color 我尝试了req.params.color,但没有成功。因此,在检查后,我发现req.query.color将返回我正在查找的值 req.params是指URL中带有“:”的项,req.query是指与“?”关

我知道如何获取以下查询的参数:

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

但是,对于像
/sample/2?color=red
这样的url,如何访问变量
color


我尝试了
req.params.color
,但没有成功。

因此,在检查后,我发现
req.query.color
将返回我正在查找的值

req.params是指URL中带有“:”的项,req.query是指与“?”关联的项

例如:

GET /something?color1=red&color2=blue
然后在express中,处理程序:

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

更新:
req.param()
现在已被弃用,因此继续前进时不要使用此答案


您的答案是最好的方式,但是我想我要指出的是,您还可以访问url、post和路由参数,所有这些都需要

就你而言:

var color = req.param('color');
从快速指南:

按以下顺序执行查找:

  • 请求参数
  • 请求正文
  • 请求查询
注:本指南并未说明以下内容:

对req.body、req.params和req.query的直接访问应该是 为清晰起见-除非您真正接受每个对象的输入


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

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

但为了更清楚地说明这一点:

req.params
将仅填充路由值。也就是说,如果您有一个类似于
/users/:id
的路由,您可以在
req.params.id
req.params['id']
中访问
id

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


因此,在回答您的问题时,由于
color
不在路线中,您应该能够使用
req.query.color
req.query['color']

快速手册规定您应该使用来访问查询字符串

//请求/显示/发布?大小=小
app.get('/display/post',函数(req、res、next){
var isSmall=req.query.size=='small';/>true
// ...
});

查询字符串和参数不同

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

请检查下面的示例可能对您有用

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

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

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

});
获取传递第二段的链接是您的id示例:

如果您遇到问题,请使用“?”运算符将传递的变量用作查询字符串

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

     var id = req.query.id; 

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

    });
获取链接,如以下示例所示:

两者都在一个例子中

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

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

});

获取链接示例:

使用req.query,获取路由中查询字符串参数中的值。 参考 假设在路由中,您希望获取name参数的值,则“get”路由处理程序将如下所示:-

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

});

我在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;
然后,在控制器主体中或express request链范围内的任何其他地方,您可以使用以下内容:

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

你能告诉我如何验证“id”吗?@AnandRaj:你的意思是:如何验证“id”?您想要什么样的验证?顺便说一句,您可以在函数中获得
id
的值,如下所示:
var-sampleId=req.params.id。在最新版本中使用
req.params.which
。请注意
req.params
req.query
不同@Adelriosantiago我不相信这个答案(来自OP)实际上回答了他自己的原始问题!他清楚地询问了如何结合位置参数(:id)访问querystring值。我有完全相同的问题,而这个答案并没有提供解决方案?!也许一些关于querystring的信息可以得到一个完整的答案这可能是一个坏主意,因为它使维护端点变得更加困难。您不再知道客户端将使用哪个方法传递参数。老实说,这实际上是这种方法的主要优点之一,不必知道字段来自何处。上面的ExpressData类充当一个桥梁,允许您模块化业务逻辑,将其从express控制器路由中移开,即您没有将“req.query”、“req.body”烘焙到代码中,这也使您的业务代码易于测试,完全在express之外。感谢您提供此代码片段,这可能会提供一些有限的、即时的帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在你的答案中添加一些解释,包括你所做的假设。谢谢。这个答案非常有用!
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!')
)