Phân tích cú pháp Chuỗi truy vấn trong node.js


86

Trong ví dụ "Hello World" này:

// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");

Làm cách nào để lấy các tham số từ chuỗi truy vấn?

http://127.0.0.1:8000/status?name=ryan

Trong tài liệu, họ đã đề cập:

node> require('url').parse('/status?name=ryan', true)
{ href: '/status?name=ryan'
, search: '?name=ryan'
, query: { name: 'ryan' }
, pathname: '/status'
}

Nhưng tôi không hiểu làm thế nào để sử dụng nó. Bất cứ ai có thể giải thích?

Câu trả lời:


136

Bạn có thể sử dụng parsephương thức từ mô-đun URL trong yêu cầu gọi lại.

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

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  var queryData = url.parse(request.url, true).query;
  response.writeHead(200, {"Content-Type": "text/plain"});

  if (queryData.name) {
    // user told us their name in the GET request, ex: http://host:8000/?name=Tom
    response.end('Hello ' + queryData.name + '\n');

  } else {
    response.end("Hello World\n");
  }
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

Tôi khuyên bạn nên đọc tài liệu mô-đun HTTP để có ý tưởng về những gì bạn nhận được trong lệnh createServergọi lại. Bạn cũng nên xem qua các trang web như http://howtonode.org/ và kiểm tra khung Express để bắt đầu với Node nhanh hơn.


Cảm ơn bạn, tôi đã thử nghiệm, nó hoạt động. Cảm ơn vì các liên kết. Đoán rằng tôi cần tìm hiểu thêm: D
LN

Liên kết này giúp tôi nhận ra điều đó [t]he request object is an instance of IncomingMessage, và điều đó http.IncomingMessage có thuộc tính url .
Treefish Zhang

Có cách nào để lấy tham số URL thay vì tham số truy vấn từ Đối tượng IncomingMessage trong node.js
sumit_suthar

30

Ngoài ra còn có phương thức của mô-đun QueryStringparse() :

var http = require('http'),
    queryString = require('querystring');

http.createServer(function (oRequest, oResponse) {

    var oQueryParams;

    // get query params as object
    if (oRequest.url.indexOf('?') >= 0) {
        oQueryParams = queryString.parse(oRequest.url.replace(/^.*\?/, ''));

        // do stuff
        console.log(oQueryParams);
    }

    oResponse.writeHead(200, {'Content-Type': 'text/plain'});
    oResponse.end('Hello world.');

}).listen(1337, '127.0.0.1');


6

node -v v9.10.1

Nếu bạn cố gắng điều khiển trực tiếp đối tượng truy vấn nhật ký, bạn sẽ gặp lỗi TypeError: Cannot convert object to primitive value

Vì vậy, tôi đề nghị sử dụng JSON.stringify

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

const server = http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url, true);

    const path = parsedUrl.pathname, query = parsedUrl.query;
    const method = req.method;

    res.end("hello world\n");

    console.log(`Request received on: ${path} + method: ${method} + query: 
    ${JSON.stringify(query)}`);
    console.log('query: ', query);
  });


  server.listen(3000, () => console.log("Server running at port 3000"));

Vì vậy, làm curl http://localhost:3000/foo\?fizz\=buzzsẽ trở lạiRequest received on: /foo + method: GET + query: {"fizz":"buzz"}


1
Điều này sẽ được chuyển lên trên cùng. Tính đến năm 2018 kết thúc, câu trả lời này giải quyết vấn đề OP của chính xác
SeaWarrior404

5

Bắt đầu với Node.js 11, url.parse và các phương thức khác của API URL kế thừa không được dùng nữa (lúc đầu chỉ trong tài liệu) thay vì API URL WHATWG được chuẩn hóa . API mới không cung cấp phân tích cú pháp chuỗi truy vấn thành một đối tượng. Điều đó có thể đạt được bằng cách sử dụng phương thức querystring.parse :

// Load modules to create an http server, parse a URL and parse a URL query.
const http = require('http');
const { URL } = require('url');
const { parse: parseQuery } = require('querystring');

// Provide the origin for relative URLs sent to Node.js requests.
const serverOrigin = 'http://localhost:8000';

// Configure our HTTP server to respond to all requests with a greeting.
const server = http.createServer((request, response) => {
  // Parse the request URL. Relative URLs require an origin explicitly.
  const url = new URL(request.url, serverOrigin);
  // Parse the URL query. The leading '?' has to be removed before this.
  const query = parseQuery(url.search.substr(1));
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.end(`Hello, ${query.name}!\n`);
});

// Listen on port 8000, IP defaults to 127.0.0.1.
server.listen(8000);

// Print a friendly message on the terminal.
console.log(`Server running at ${serverOrigin}/`);

Nếu bạn chạy tập lệnh ở trên, bạn có thể kiểm tra phản hồi của máy chủ như sau, ví dụ:

curl -q http://localhost:8000/status?name=ryan
Hello, ryan!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.