Parsing Query String in node.js

后端 未结 5 1136
生来不讨喜
生来不讨喜 2020-12-22 23:11

In this \"Hello World\" example:

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

// Configure our HTTP server to respond wit         


        
相关标签:
5条回答
  • 2020-12-22 23:50

    You can use the parse method from the URL module in the request callback.

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

    I suggest you read the HTTP module documentation to get an idea of what you get in the createServer callback. You should also take a look at sites like http://howtonode.org/ and checkout the Express framework to get started with Node faster.

    0 讨论(0)
  • 2020-12-22 23:55

    node -v v9.10.1

    If you try to console log query object directly you will get error TypeError: Cannot convert object to primitive value

    So I would suggest use 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"));
    

    So doing curl http://localhost:3000/foo\?fizz\=buzz will return Request received on: /foo + method: GET + query: {"fizz":"buzz"}

    0 讨论(0)
  • 2020-12-23 00:01
    require('url').parse('/status?name=ryan', {parseQueryString: true}).query
    

    returns

    { name: 'ryan' }
    

    ref: https://nodejs.org/api/url.html#url_urlobject_query

    0 讨论(0)
  • 2020-12-23 00:13

    There's also the QueryString module's parse() method:

    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');
    
    0 讨论(0)
  • 2020-12-23 00:13

    Starting with Node.js 11, the url.parse and other methods of the Legacy URL API were deprecated (only in the documentation, at first) in favour of the standardized WHATWG URL API. The new API does not offer parsing the query string into an object. That can be achieved using tthe querystring.parse method:

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

    If you run the script above, you can test the server response like this, for example:

    curl -q http://localhost:8000/status?name=ryan
    Hello, ryan!
    
    0 讨论(0)
提交回复
热议问题