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

时间:2011-08-02 13:08:32

标签: node.js query-string express

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

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

30 个答案:

答案 0 :(得分:1597)

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

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

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

app.listen(3000);

答案 1 :(得分:952)

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

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

否则,在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;

答案 2 :(得分:440)

在快递中,使用req.query

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

  

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

     

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

     

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

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

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

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

答案 3 :(得分:128)

对于Express.js,您想要req.params

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

答案 4 :(得分:69)

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

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

答案 5 :(得分:37)

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

})

答案 6 :(得分:35)

你应该可以这样做:

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

答案 7 :(得分:35)

如果您使用的是 ES6 Express ,请尝试使用此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)

答案 8 :(得分:30)

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

方法1: 传递/ routename /:paramname
等参数的MVC方法 在这种情况下,您可以使用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);

方法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);

答案 9 :(得分:24)

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:某事


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

答案 10 :(得分:18)

怀特夸克回应得很好。但是对于当前版本的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'));
})

答案 11 :(得分:18)

一个小型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”在控制台上运行它。

答案 12 :(得分:13)

这很简单:

示例网址

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

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

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

<强>输出

  

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

打印具体:

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

<强>输出

  

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

答案 13 :(得分:12)

你可以使用express ^ 4.15.4:

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

希望这有帮助。

答案 14 :(得分:11)

您可以使用

request.query.<varible-name>;

答案 15 :(得分:5)

express.js中,您可以轻松实现它,您需要在控制器功能中做的只是:

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

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

PD。 {id}代表Object destructuring,这是es6的一项新功能。

答案 16 :(得分:2)

这里有很多关于使用 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);

答案 17 :(得分:2)

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

您可以使用此方法,也可以尝试使用主体解析器从请求参数中解析特殊元素。

答案 18 :(得分:0)

表达具体的简单获取方式

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

答案 19 :(得分:0)

如果您想避免快递,请使用以下示例:

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

by y

答案 20 :(得分:0)

如果您需要同时向GETIP发送Domain请求(其他答案未提及,您可以指定一个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) => { ......

答案 21 :(得分:0)

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

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

app.listen(3000);

答案 22 :(得分:0)

因此,可以通过两种方式接收此“ 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)另一种方法是使用查询参数。 因此该网址看起来像“ ..... \ 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);
});

答案 23 :(得分:0)

实际上很简单:

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

app.get('/post', (req, res, next) => {
  res.send('ID:' + req.query.id + ' Edit:'+ req.query.edit);
});

app.listen(1000);

// localhost:1000/post?id=123&edit=true
// output: ID: 123 Edit: true

答案 24 :(得分:0)

从我的角度来看,我认为许多人将两个不同的概念混在一起。在REST开发期间,我熟悉通过两种方式在URL中传递信息:“路径变量”和“请求参数”(查询参数)。 RFC如下描述URI的各个部分:enter link description here因此,我了解到作者很想知道如何传递请求参数。我只想使该主题更容易理解,但是这里多次提到了该解决方案。

您可以使用request.query.<name of the parameter>从URI获取查询参数,提到的第二个解决方案是request.params.<name of the parameter>,并可以获取路径变量。

答案 25 :(得分:0)

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

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
});

答案 26 :(得分:-1)

为什么不与服务器代码混合

例如。 php

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>

答案 27 :(得分:-1)

在Express中,我们可以简单地使用req.query.<name>。它与PHP中的$_GET['name']相同。

答案 28 :(得分:-1)

我在Express@4.16上使用 MEANJS 0.6.0 ,很好

客户

控制器:

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
  ...

答案 29 :(得分:-3)

--------访问查询字符串数据-------
假设这是链接http://webapplog.com/search?term=node.js&page=1

因此,在快递中,您可以使用:

  • req.query.term
  • req.query.page
  • req.query(它将在对象中获取查询)

    //示例
    app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{ res.json({term:req.query.term, page:req.query.page}) })

--------访问URL参数-------
假设这是链接http://webapplog.com/node.js/pages/100
因此,您可以使用快递: app.get('/:term/pages/:page',....)

  • req.params.term
  • req.params.page

    //示例
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })