如何在Node.js上的Express.js中获取GET(查询字符串)变量?

XMe*_*Men 1115 node.js query-string express

我们可以在Node.js中的查询字符串中获取变量,就像我们$_GET在PHP中获取它们一样吗?

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

whi*_*ark 1630

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

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

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

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是你应该使用`req.query.id`,不需要使用括号表示法. (67认同)
  • 对于 url-path-params (/user/:id),请使用 `req.params.id`,因为上面的答案适用于 url-query-params (/user?id=123) (4认同)

小智 1078

在Express中它已经为你完成了,你可以简单地使用req.query:

var id = req.query.id; // $_GET["id"]
Run Code Online (Sandbox Code Playgroud)

否则,在NodeJS中,您可以手动访问req.url和内置url模块到[url.parse](https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost):

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Run Code Online (Sandbox Code Playgroud)

  • 这已被接受但不是首选答案.见下文!使用`req.query` (175认同)
  • 注意:.parse(url,**true**)`url.parse(urlStr,[parseQueryString],[slashesDenoteHost])` (22认同)
  • *-1*.上面的代码是一个载重量 - 一个好的开发人员会在现场进行重构.这是"_如何获取URL的查询字符串?_"的答案 - 有问题的URL恰好位于名为`request`的对象中,与Express无关.请参阅下面的@ whitequark的答案(使用`request.query`) (9认同)
  • mikemcneil的回答如下是一个更好的选择.使用`req.query`或`req.param`(与`req.params`不同...见下文. (2认同)

mik*_*eil 457

在Express中,使用req.query.

req.params只获取路由参数,而不是查询字符串参数.查看expresssails文档:

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

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

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

也就是说,大多数情况下,您希望获得参数的值,而不管其来源.在那种情况下,使用req.param('foo').

无论变量是在路由参数,查询字符串还是编码的请求主体中,都将返回参数的值.

旁注 - 如果你的目标是获得所有三种类型的请求参数(类似于PHP $_REQUEST)的交集,你只需要将参数合并在一起 - 这就是我在Sails中设置它的方法.请记住,路径/路由参数object(req.params)具有数组属性,因此顺序很重要(尽管在Express 4中可能会有所改变)

  • req.param在express 4.x中已弃用,应使用req.params,req.body或req.query代替:http://expressjs.com/en/4x/api.html#req.param (7认同)
  • @deltab这里是Sails文档中`req.params`的链接:http://sailsjs.org/#/documentation/reference/req/req.params.html和新的快递文档:http://expressjs.com /4x/api.html#req.params (3认同)

Cri*_*s-O 138

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

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

  • 要在express.js中检索GET变量,您可以使用req.query. (7认同)
  • @Andy req.params更好,因为:req.param(name [,default])将:当存在或默认时返回param名称的值.检查路由参数(req.params),例如:/ user /:id检查查询字符串参数(req.query),例如:?id = 12检查urlencoded body params(req.body),例如:id = 12利用urlencoded请求身体,req.body应该是一个对象.这可以通过使用_express.bodyParser中间件来完成. (6认同)
  • req.param('parameterName')将检查req.body,req.query和req.params,但如果您想将所有查询参数作为对象,则应使用req.query. (3认同)

小智 73

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

var query = require('url').parse(req.url,true).query;
Run Code Online (Sandbox Code Playgroud)

那你就可以打电话了

var id = query.id;
var option = query.option;
Run Code Online (Sandbox Code Playgroud)

get的URL应该是哪里

/path/filename?id=123&option=456
Run Code Online (Sandbox Code Playgroud)

  • 不会id和选项未定义,因为查询只是一个字符串?我们必须用正则表达式等解析出两个独立的参数. (2认同)

Ste*_*gin 44

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

const {id, since, fields, anotherField} = request.query;
Run Code Online (Sandbox Code Playgroud)

在上下文中:

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

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

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

您也可以使用默认值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)
Run Code Online (Sandbox Code Playgroud)


Pul*_*hri 43

表达具体简单的获取方式

  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);
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)


小智 42

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

})
Run Code Online (Sandbox Code Playgroud)


Rob*_*itt 38

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

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")
})
Run Code Online (Sandbox Code Playgroud)


Omk*_*kar 34

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

方法1:传递参数的MVC方法如/ routename /:paramname
在这种情况下你可以使用req.params.paramname来获取参数值For Example请参考下面的代码我在哪里我希望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);
Run Code Online (Sandbox Code Playgroud)

方法2:一般方法:使用'?'将变量作为查询字符串传递 运算符
例如,请参考下面的代码,我期望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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 25

更新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");
Run Code Online (Sandbox Code Playgroud)

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

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

我收到了身份证件:某事


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


adr*_*o72 19

一个小型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);
Run Code Online (Sandbox Code Playgroud)

保存为parse.js,并通过输入"node parse.js"在控制台上运行它.

  • 在这个例子中你不需要sys (3认同)

小智 19

Whitequark反应很好.但是对于当前版本的Node.js和Express.js,它还需要一行.确保添加'require http'(第二行).我在这里发布了一个更全面的例子,说明了这个调用是如何工作的.运行后,输入http://localhost:8080/?name=abel&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'));
})
Run Code Online (Sandbox Code Playgroud)


小智 14

这很简单:

示例网址:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
Run Code Online (Sandbox Code Playgroud)

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

console.log("All query strings: " + JSON.stringify(req.query));
Run Code Online (Sandbox Code Playgroud)

产量

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

打印具体:

console.log("activatekey: " + req.query.activatekey);
Run Code Online (Sandbox Code Playgroud)

产量

activatekey:$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK


小智 12

您可以使用express ^ 4.15.4:

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

希望这可以帮助.


小智 11

您可以使用

request.query.<varible-name>;
Run Code Online (Sandbox Code Playgroud)


Sah*_*pal 8

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

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


Meh*_*lah 7

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

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


Kev*_*mán 6

express.js你能得到它很容易的,所有你需要做在你的控制器的功能是:

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

这就是全部,假设您使用的是es6语法.

PD.{id}代表Object destructuring一种新的es6功能.


Luk*_*uke 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);
Run Code Online (Sandbox Code Playgroud)

请求/?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);
Run Code Online (Sandbox Code Playgroud)