Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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上获取Express.js中的get(查询字符串)变量?_Node.js_Query String_Express - Fatal编程技术网

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

如何在Node.js上获取Express.js中的get(查询字符串)变量?,node.js,query-string,express,Node.js,Query String,Express,我们可以像在PHP中的$\u get中一样在Node.js中获取查询字符串中的变量吗 我知道在Node.js中,我们可以在请求中获取URL。是否有获取查询字符串参数的方法?在Express中,它已经为您完成了,您可以简单地使用: var id = req.query.id; // $_GET["id"] 否则,在NodeJS中,您可以访问内置的url模块并手动将其访问: var url = require('url'); var url_parts = url.parse(

我们可以像在PHP中的
$\u get
中一样在Node.js中获取查询字符串中的变量吗


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

在Express中,它已经为您完成了,您可以简单地使用:

var id = req.query.id; // $_GET["id"]
否则,在NodeJS中,您可以访问内置的
url
模块并手动将其访问:

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

您应该能够执行以下操作:

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

既然您在标签中提到了Express.js,下面是一个特定于Express的答案:。例如


对于Express.js,您要执行
req.params

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

在Express中,使用
req.query

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

(请求参数)检查路由参数,例如:/user/:id

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

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

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

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


旁注-如果您的目标是获得所有三种类型的请求参数的交集(类似于PHP的
$\u request
),那么您只需要将这些参数合并在一起——下面是我的方法。请记住,路径/路由参数对象(
req.params
)具有数组属性,因此顺序很重要(尽管如此)

2014年5月4日更新

旧答案保留在这里:


1) Install express:
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

我收到了身份证:什么



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

我从其他答案中学到了一些东西,并决定在我的整个网站上使用以下代码:

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

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

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”运行它。

非常简单:

示例URL:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
console.log("All query strings: " + JSON.stringify(req.query));
console.log("activatekey: " + req.query.activatekey);
您可以使用以下命令打印查询字符串的所有值:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
console.log("All query strings: " + JSON.stringify(req.query));
console.log("activatekey: " + req.query.activatekey);
输出

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

要打印特定内容:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
console.log("All query strings: " + JSON.stringify(req.query));
console.log("activatekey: " + req.query.activatekey);
输出

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


怀特夸克反应很好。但对于Node.js和Express.js的当前版本,还需要一行代码。确保添加“需要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'));
})

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

方法1: 通过MVC方法传递参数,如/routename/:paramname
在这种情况下,您可以使用req.params.paramname获取参数值,例如,请参阅下面的代码,其中我希望Id为参数
链接可能类似于:

方法2: 一般方法:使用“?”运算符将变量作为查询字符串传递
例如,请参阅下面的代码,其中我希望Id作为查询参数
链接可能类似于:


如果您使用的是ES6Express,请尝试此
解构方法:

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);
您也可以将默认值用于分解

//测试请求示例
常数要求={
查询:{
id:'123',
字段:['a','b','c']
}
}
常数{
身份证件
自=新日期().toString(),
字段=['x'],
另一个字段='default'
}=请求查询;
log(id、自、字段、其他字段)
您可以使用

request.query.<varible-name>;
request.query。;

您可以在express ^4.15.4中使用:

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

希望这有帮助。

您可以使用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;
例如:


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

客户端:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
console.log("All query strings: " + JSON.stringify(req.query));
console.log("activatekey: " + req.query.activatekey);
控制器:

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

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

express.js
中,您可以非常轻松地获得它,在控制器函数中只需执行以下操作:

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})
仅此而已,假设您使用的是es6语法


警察局
{id}
代表
对象分解
,这是es6的一项新功能。

因此,有两种方法可以接收此“id”: 1) 使用params:代码params将类似于: 假设我们有一个数组

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];
然后,对于params,我们可以执行以下操作:

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

如果您需要将
GET
请求发送到
IP
以及
(其他答案没有提到您可以指定
端口
变量),您可以使用此功能:

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')
也赤裸裸的在心里
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);
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);
 var app = express();

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

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

 app.listen(3000);