【问题标题】:How to get GET (query string) variables in Express.js on Node.js?如何在 Node.js 上的 Express.js 中获取 GET(查询字符串)变量?
【发布时间】:2011-10-18 06:16:26
【问题描述】:

我们能否像在 PHP 中在 $_GET 中获取变量一样,在 Node.js 中获取查询字符串中的变量?

我知道在 Node.js 中我们可以获取请求中的 URL。有没有获取查询字符串参数的方法?

【问题讨论】:

标签: node.js query-string express


【解决方案1】:

考虑这个网址 -> /api/endpoint/:id?name=sahil 这里 id 是参数,名称是查询。你可以像这样在nodejs中获取这个值

app.get('/api/endpoint/:id', (req, res) => {
  const name = req.query.name; // query
  const id = req.params.id //params
});

【讨论】:

  • '/'/api/endpoint/:id 不匹配,这与 the accepted answer 在其他方面相同,但信息量较少。
  • @Quentin 感谢您指出错误。我更正了。
【解决方案2】:

像我一样

npm  query-string
import queryString from "query-string";

export interface QueryUrl {
  limit?: number;
  range?: string;
  page?: number;
  filed?: string;
  embody?: string;
  q?: string | object;
  order?: number;
  sort?: string;

}

 let parseUri: QueryUrl = queryString.parse(uri.query);

【讨论】:

    【解决方案3】:

    在 Express 中,使用 req.query

    req.params 只获取路由参数,不获取查询字符串参数。请参阅 expresssails 文档:

    (req.params) 检查路由参数,例如:/user/:id

    (req.query) 检查查询字符串参数,例如:?id=12 检查 urlencoded 正文参数

    (req.body), ex: id=12 要使用 urlencoded 请求正文,req.body 应该是一个对象。这可以通过使用 _express.bodyParser 中间件来完成。

    也就是说,大多数时候,您都希望获取参数的值,而不管其来源如何。在这种情况下,请使用req.param('foo')。请注意,从 Express 4 开始,这已被弃用:http://expressjs.com/en/4x/api.html#req.param

    无论变量是在路由参数、查询字符串还是编码的请求正文中,都会返回参数的值。

    旁注-如果您的目标是获取所有三种类型的请求参数的交集(类似于 PHP 的 $_REQUEST),您只需将参数合并在一起 - 这是我 set it up in Sails 的方法。请记住,路径/路由参数对象 (req.params) 具有数组属性,因此顺序很重要(尽管这是 may change in Express 4

    【讨论】:

    • req.param('STRING') 是正确的答案。请参阅此处:stackoverflow.com/questions/17007997/…(向下滚动以在接受的答案下方回答)
    • @deltab 这是 Sails 文档中的 req.params 的链接:sailsjs.org/#/documentation/reference/req/req.params.html 和新的 express 文档:expressjs.com/4x/api.html#req.params
    • req.param 在 express 4.x 中已弃用,应使用 req.params、req.body 或 req.query 代替:expressjs.com/en/4x/api.html#req.param
    • @swang 是对的——我最近与 Doug Wilson 再次确认了这一点,req.param() 辅助函数很可能在 Express 5 中被完全删除。这要等到一段时间后才会发生2017 年晚些时候,所以我会等到那时再编辑这个答案。同时:将req.param() 与 Express 和 与 Express 4 的最新可用版本一起使用是安全的,尽管带有弃用日志消息。 (对于 Sails 用户:req.param() 的实现将从 Sails v1.0 开始进入核心,未来将继续在 Sails 中得到全面支持。)
    【解决方案4】:

    表达具体的简单获取方式

    1. 查询字符串(在 '?' 之后),例如 https://...?user=abc&id=123

      var express = require('express');

       var app = express();
      
       app.get('/', function(req, res){
           res.send('id: ' + req.query.id);
       });
      
       app.listen(3000);
      
    2. 查询参数,例如 https://.../get/users/:id

      var express = require('express'); var app = express();

       app.get('/get/users/:id', function(req, res){
           res.send('id: ' + req.params.id);
       });
      
       app.listen(3000);
      

    【讨论】:

      【解决方案5】:

      这里有很多关于使用request.query 访问查询的答案,但是没有一个提到它的类型怪癖。查询字符串类型可以是字符串也可以是数组,该类型由用户控制。

      例如使用以下代码:

      const express = require("express");
      const app = express();
      
      app.get("/", function (req, res) {
        res.send(`Your name is ${(req.query.name || "").length} characters long`);
      });
      
      app.listen(3000);
      

      请求/?name=bob 将返回Your name is 3 characters long,但请求/?name=bob&name=jane 将返回Your name is 2 characters long,因为参数现在是一个数组['bob', 'jane']

      Express 提供 2 种查询解析器:简单的和扩展的,两者都会为您提供字符串或数组。我个人认为您应该重写解析器以获得一致的类型,而不是检查可能的副作用或验证类型的方法:所有数组或所有字符串。

      const express = require("express");
      const app = express();
      
      const querystring = require("querystring");
      
      // if asArray=false only the first item with the same name will be returned
      // if asArray=true all items will be returned as an array (even if they are a single item)
      const asArray = false;
      app.set("query parser", (qs) => {
        const parsed = querystring.parse(qs);
        return Object.entries(parsed).reduce((previous, [key, value]) => {
          const isArray = Array.isArray(value);
          if (!asArray && isArray) {
            value = value[0];
          } else if (asArray && !isArray) {
            value = [value];
          }
      
          previous[key] = value;
          return previous;
        }, {});
      });
      
      app.get("/", function (req, res) {
        res.send(`Your name is ${(req.query.name || "").length} characters long`);
      });
      
      app.listen(3000);
      

      【讨论】:

        【解决方案6】:

        如果你想避免表达,使用这个例子:

        var http = require('http');
        const url = require('url');
        
        function func111(req, res) {
          res.writeHead(200, {'Content-Type': 'text/plain'});
          var q = url.parse(req.url, true);
          res.end("9999999>>> " + q.query['user_name']); 
        }
        
        http.createServer(func111).listen(3000); 
        

        用法:

        curl http://localhost:3000?user_name=user1
        

        由 yl

        【讨论】:

        • 在shell中使用curl查询服务器时,一定要引用URL。否则,URL 中的任何 & 符号 (&) 将被视为在 curl 命令之后执行的额外命令。这可能非常令人沮丧,因为服务器只会收到第一个查询字符串参数并且不会抛出任何错误:)
        【解决方案7】:

        在 Express 中已经为您完成了,您只需使用 req.query 即可:

        var id = req.query.id; // $_GET["id"]
        

        否则,在NodeJS中,你可以手动访问req.url和内置的url模块到url.parse它:

        var url = require('url');
        var url_parts = url.parse(request.url, true);
        var query = url_parts.query;
        

        【讨论】:

        • 这里注意:.parse(url,true) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
        • hapi 提供了哪些额外/更好的功能(如果有的话)?
        • 这是可以接受的,但不是首选答案。见下文!使用req.query
        • mikemcneil 下面的回答是一个更好的选择。使用req.queryreq.param(不同于req.params...见下文。
        • -1。上面的代码是无用的——优秀的开发人员会当场重构。这是对“如何获取 URL 的查询字符串?”的回答——所讨论的 URL 恰好位于名为 request 的对象中,与 Express 无关。请参阅下面@whitequark 的答案(使用request.query
        【解决方案8】:

        如果您需要向IPDomain 发送GET 请求(其他答案未提及您可以指定port 变量),您可以使用此功能:

        function getCode(host, port, path, queryString) {
            console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")
        
            // Construct url and query string
            const requestUrl = url.parse(url.format({
                protocol: 'http',
                hostname: host,
                pathname: path,
                port: port,
                query: queryString
            }));
        
            console.log("(" + host + path + ")" + "Sending GET request")
            // Send request
            console.log(url.format(requestUrl))
            http.get(url.format(requestUrl), (resp) => {
                let data = '';
        
                // A chunk of data has been received.
                resp.on('data', (chunk) => {
                    console.log("GET chunk: " + chunk);
                    data += chunk;
                });
        
                // The whole response has been received. Print out the result.
                resp.on('end', () => {
                    console.log("GET end of response: " + data);
                });
        
            }).on("error", (err) => {
                console.log("GET Error: " + err);
            });
        }
        

        不要错过文件顶部的要求模块:

        http = require("http");
        url = require('url')
        

        另外请记住,您可以使用https 模块通过安全域和 ssl 进行通信。所以这两行会改变:

        https = require("https");
        ...
        https.get(url.format(requestUrl), (resp) => { ......
        

        【讨论】:

          【解决方案9】:

          通过 GET 方法传递参数有两种方式

          方法一: 传递参数的 MVC 方法,例如 /routename/:paramname
          在这种情况下,您可以使用 req.params.paramname 来获取参数值例如,请参阅下面的代码,我期望 Id 作为参数
          链接可能是:http://myhost.com/items/23

          var express = require('express');
          var app = express();
          app.get("items/:id", function(req, res) {
              var id = req.params.id;
              //further operations to perform
          });
          app.listen(3000);
          

          方法二: 一般方法:使用“?”将变量作为查询字符串传递运营商
          例如,请参阅下面的代码,我期望 Id 作为查询参数
          链接可能是:http://myhost.com/items?id=23

          var express = require('express');
          var app = express();
          app.get("/items", function(req, res) {
              var id = req.query.id;
              //further operations to perform
          });
          app.listen(3000);
          

          【讨论】:

            【解决方案10】:
            app.get('/user/:id', function(req, res) {
                res.send('user' + req.params.id);    
            });
            

            您可以使用它,也可以尝试使用 body-parser 从请求参数中解析特殊元素。

            【讨论】:

            • 您能否进一步解释一下这是如何回答这个问题的?
            • 这如何解析一个现有的参数列表?
            • 你可以使用 node.js 中的 body-parser 模块
            【解决方案11】:

            因此,可以通过两种方式接收此“id”: 1)使用参数:代码参数看起来像: 假设我们有一个数组,

            const courses = [{
                id: 1,
                name: 'Mathematics'
            },
            {
                id: 2,
                name: 'History'
            }
            ];
            

            那么对于参数我们可以做这样的事情:

            app.get('/api/posts/:id',(req,res)=>{
                const course = courses.find(o=>o.id == (req.params.id))
                res.send(course);
            });
            

            2) 另一种方法是使用查询参数。 所以 url 看起来像 ".....\api\xyz?id=1" 其中 "?id=1" 是查询部分。在这种情况下,我们可以这样做:

            app.get('/api/posts',(req,res)=>{
                const course = courses.find(o=>o.id == (req.query.id))
                res.send(course);
            });
            

            【讨论】:

              【解决方案12】:

              如果您使用的是 ES6Express,请尝试以下destructuring 方法:

              const {id, since, fields, anotherField} = request.query;
              

              在上下文中:

              const express = require('express');
              const app = express();
              
              app.get('/', function(req, res){
                 const {id, since, fields, anotherField} = req.query;
              });
              
              app.listen(3000);
              

              destructuring 也可以使用默认值:

              // sample request for testing
              const req = {
                query: {
                  id: '123',
                  fields: ['a', 'b', 'c']
                }
              }
              
              const {
                id,
                since = new Date().toString(),
                fields = ['x'],
                anotherField = 'default'
              } = req.query;
              
              console.log(id, since, fields, anotherField)

              【讨论】:

              • 使用带有默认值的对象解构! +1
              【解决方案13】:

              您可以使用 express ^4.15.4:

              var express = require('express'),
                  router = express.Router();
              router.get('/', function (req, res, next) {
                  console.log(req.query);
              });
              

              希望这会有所帮助。

              【讨论】:

                【解决方案14】:

                express.js 中你可以很容易地得到它,你需要在你的控制器函数中做的是:

                app.get('/', (req, res, next) => {
                   const {id} = req.query;
                   // rest of your code here...
                })
                

                仅此而已,假设您使用的是 es6 语法。

                PD。 {id} 代表 Object destructuring,一个新的 es6 特性。

                【讨论】:

                • 我在 node 上使用 express,所以这对我来说非常有效。谢谢!
                【解决方案15】:

                我正在使用 MEANJS 0.6.0 和 express@4.16,很好

                客户:

                控制器:

                var input = { keyword: vm.keyword };
                ProductAPi.getOrder(input)
                

                服务:

                this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
                

                服务器

                路线

                app.route('/api/order').get(products.order);
                

                控制器

                exports.order = function (req, res) {
                  var keyword = req.query.keyword
                  ...
                

                【讨论】:

                  【解决方案16】:

                  你可以通过url.parse使用url模块来收集参数

                  var url = require('url');
                  var url_data = url.parse(request.url, true);
                  var query = url_data.query;
                  

                  在 expressjs 中,它是由完成的,

                  var id = req.query.id;
                  

                  例如:

                  var express = require('express');
                  var app = express();
                  
                  app.get('/login', function (req, res, next) {
                      console.log(req.query);
                      console.log(req.query.id); //Give parameter id
                  });
                  

                  【讨论】:

                    【解决方案17】:

                    你可以使用

                    request.query.<varible-name>;
                    

                    【讨论】:

                      【解决方案18】:
                      //get query&params in express
                      
                      //etc. example.com/user/000000?sex=female
                      
                      app.get('/user/:id', function(req, res) {
                      
                        const query = req.query;// query = {sex:"female"}
                      
                        const params = req.params; //params = {id:"000000"}
                      
                      })
                      

                      【讨论】:

                        【解决方案19】:

                        Whitequark 的反应很好。但是对于当前版本的 Node.js 和 Express.js,它需要多一行。确保添加“需要 http”(第二行)。我在这里发布了一个更完整的例子,展示了这个调用是如何工作的。运行后,在浏览器中输入http://localhost:8080/?name=abel&amp;fruit=apple,你会得到一个基于代码的很酷的响应。

                        var express = require('express');
                        var http = require('http');
                        var app = express();
                        
                        app.configure(function(){
                            app.set('port', 8080);
                        });
                        
                        app.get('/', function(req, res){
                          res.writeHead(200, {'content-type': 'text/plain'});
                          res.write('name: ' + req.query.name + '\n');
                          res.write('fruit: ' + req.query.fruit + '\n');
                          res.write('query: ' + req.query + '\n');
                          queryStuff = JSON.stringify(req.query);
                          res.end('That\'s all folks'  + '\n' + queryStuff);
                        });
                        
                        http.createServer(app).listen(app.get('port'), function(){
                            console.log("Express server listening on port " + app.get('port'));
                        })
                        

                        【讨论】:

                          【解决方案20】:

                          就这么简单:

                          示例网址:

                          http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
                          

                          您可以使用以下命令打印查询字符串的所有值:

                          console.log("All query strings: " + JSON.stringify(req.query));
                          

                          输出

                          所有查询字符串:{ "id":"3","activatekey":"$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjz fUrqLrgS3zXJVfVRK"}

                          具体打印:

                          console.log("activatekey: " + req.query.activatekey);
                          

                          输出

                          激活密钥:$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK

                          【讨论】:

                            【解决方案21】:

                            一个小型 Node.js HTTP 服务器侦听端口 9080,解析 GET 或 POST 数据并将其作为响应的一部分发送回客户端:

                            var sys = require('sys'),
                            url = require('url'),
                            http = require('http'),
                            qs = require('querystring');
                            
                            var server = http.createServer(
                            
                                function (request, response) {
                            
                                    if (request.method == 'POST') {
                                            var body = '';
                                            request.on('data', function (data) {
                                                body += data;
                                            });
                                            request.on('end',function() {
                            
                                                var POST =  qs.parse(body);
                                                //console.log(POST);
                                                response.writeHead( 200 );
                                                response.write( JSON.stringify( POST ) );
                                                response.end();
                                            });
                                    }
                                    else if(request.method == 'GET') {
                            
                                        var url_parts = url.parse(request.url,true);
                                        //console.log(url_parts.query);
                                        response.writeHead( 200 );
                                        response.write( JSON.stringify( url_parts.query ) );
                                        response.end();
                                    }
                                }
                            );
                            
                            server.listen(9080);
                            

                            另存为parse.js,在控制台输入“node parse.js”运行。

                            【讨论】:

                            • 在这个例子中你不需要 sys
                            【解决方案22】:

                            我从其他答案中学习并决定在我的网站中使用此代码:

                            var query = require('url').parse(req.url,true).query;
                            

                            然后你就可以打电话了

                            var id = query.id;
                            var option = query.option;
                            

                            get 的 URL 应该在哪里

                            /path/filename?id=123&option=456
                            

                            【讨论】:

                            • 不会因为查询只是一个字符串而未定义 id 和 option 吗?我们必须使用正则表达式等解析出两个单独的参数。
                            • @ossek 我相信在req.url 上引起parse 的行为会转换为一个对象。
                            • @ossek,他提供了 true 作为 url.parse 的第二个参数,这使得查询属性指向一个对象(并且内部使用 querystring 模块)你可以在文档中找到更多关于它的信息 [在这里] (nodejs.org/docs/latest/api/…)
                            【解决方案23】:

                            对于 Express.js 你想做req.params:

                            app.get('/user/:id', function(req, res) {
                              res.send('user' + req.params.id);    
                            });
                            

                            【讨论】:

                            • 要在 express.js 中检索 GET 变量,您可以使用 req.query。
                            • @Andy req.params 更好,因为: req.param(name[, default]) 将:在存在或默认时返回参数名称的值。检查路由参数(req.params),例如:/user/:id 检查查询字符串参数(req.query),例如:?id=12检查 urlencoded 正文参数(req.body),例如:id=12 使用 urlencoded 请求身体,req.body 应该是一个对象。这可以通过使用 _express.bodyParser 中间件来完成。
                            • 我不知道 req.param 检查 req.query,感谢您的说明。
                            • req.param('parameterName') 将检查 req.body、req.query 和 req.params,但如果您希望将所有查询参数作为一个对象,则应使用 req。查询。
                            • @mikermcneil 你可能混淆了 req.param() 和 req.params (object)。根据 expressjs docs req.param() 在所有三个对象中查找值。 expressjs.com/api.html#req.param
                            【解决方案24】:

                            由于您在标签中提到了 Express.js,因此这里有一个特定于 Express 的答案:use req.query。例如

                            var express = require('express');
                            var app = express();
                            
                            app.get('/', function(req, res){
                              res.send('id: ' + req.query.id);
                            });
                            
                            app.listen(3000);
                            

                            【讨论】:

                            • 值得一提的是你应该使用req.query.id,不需要使用括号符号。
                            • 安装 express 这样做:是 | sudo npm install -g express --- 我试图编辑,但 Alexis King 已被还原。
                            • 在问题中他正在寻找一种方法来获取所有查询字符串参数,如数组。正确答案是这样的:app.get('/', function(req, res){ console.log(req.query); });
                            • @alex 使用点语法而不是括号表示法没有优势。如果你使用一个或另一个真的没关系
                            • 对于 url-path-params (/user/:id),使用req.params.id,因为上面的答案是 url-query-params (/user?id=123)
                            【解决方案25】:

                            你应该可以做这样的事情:

                            var http = require('http');
                            var url  = require('url');
                            
                            http.createServer(function(req,res){
                                var url_parts = url.parse(req.url, true);
                                var query = url_parts.query;
                            
                                console.log(query); //{Object}
                            
                                res.end("End")
                            })
                            

                            【讨论】:

                              【解决方案26】:

                              2014 年 5 月 4 日更新

                              此处保留旧答案:https://gist.github.com/stefek99/b10ed037d2a4a323d638


                              1) 安装快递:npm install express

                              app.js

                              var express = require('express');
                              var app = express();
                              
                              app.get('/endpoint', function(request, response) {
                                  var id = request.query.id;
                                  response.end("I have received the ID: " + id);
                              });
                              
                              app.listen(3000);
                              console.log("node express app started at http://localhost:3000");
                              

                              2) 运行应用程序:node app.js

                              3) 在浏览器中访问:http://localhost:3000/endpoint?id=something

                              我已收到 ID:某事


                              (自从我的回答以来,很多事情都发生了变化,我相信值得保持更新)

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2014-12-05
                                相关资源
                                最近更新 更多