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

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


当前回答

如果您需要向IP和域发送GET请求(其他答案没有提到您可以指定端口变量),您可以使用此函数:

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) => { ......

其他回答

既然您在标签中提到了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);

这里有很多关于使用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将返回您的姓名长3个字符,但请求/?name=bob&name=jane将返回您的名字有2个字符长,因为参数现在是一个数组['bob','jane']。

Express提供了两个查询解析器:简单的和扩展的,它们都将为您提供字符串或数组。我个人认为,应该重写解析器,使其具有一致的类型:所有数组或所有字符串,而不是检查方法的可能副作用或验证类型。

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 query = require('url').parse(req.url,true).query;

那你可以打电话

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

get的URL应该在哪里

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

通过GET方法传递参数有两种方法方法1: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);

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

您可以使用

request.query.<varible-name>;