nodejs url解析返回一个额外的未定义对象

时间:2019-01-22 23:53:22

标签: node.js http url

我正在编写一个节点js脚本,以从url行中提取变量。

var http = require('http');//http package
var  url = require('url');// url package  
var server = http.createServer(function(req, res){// creates server
    res.writeHead(200, {'Content-Type': 'text/html'});
    var q = url.parse(req.url, true).query//pulls apart the url
    var temp = q.temp;
    res.write(temp);
    console.log(q.temp);
    res.end();
}).listen(7474)

无论何时测试,脚本都会返回某种额外的变量。如果我喂它http://localhost:7474/?temp=29,我会得到:

29
undefined

在我的控制台内。对于此脚本中的其他一些功能,它将导致整个系统崩溃。和失败一样 The first argument must be one of type string or Buffer. Received type undefined

那是为什么?而我该如何纠正这种情况?

1 个答案:

答案 0 :(得分:0)

您应该再次使用res.write(),然后再使用res.end()。后者不应该返回数据。

尽管它可以在第一个参数中返回字符串值,然后将字符串的编码格式定义为第二个参数,但我从未尝试过...

“如果指定了数据,则相当于调用response.write(数据,编码),然后调用response.end(回调)。”

https://nodejs.org/api/http.html#http_response_end_data_encoding_callback

var http = require('http');//http package
var  url = require('url');// url package
var list = ['0', '0', '1', '0'];  
var server = http.createServer(function(req, res){// creates server
    res.writeHead(200, {'Content-Type': 'text/html'});
    var q = url.parse(req.url, true).query//pulls apart the url
    var temp = q.temp;
    res.write(temp);
    console.log(q.temp);
    res.write(list[2] ); //testing artifact displayes them on a browser
    res.end();
}).listen(7474)

在这种情况下,实际上没有理由同时向.write()发出两个呼叫,因此我将它们合并在一起...

res.write(JSON.stringify([ temp, list[2] ]));

res.write(JSON.stringify({ temp, listItem:list[2] }));

编辑:

在我自己运行此代码后,您在这里遇到了另一个问题,这给了您那些令人困惑的错误。现在尝试一下...

var http = require('http');//http package
var  url = require('url');// url package
var list = ['0', '0', '1', '0'];  

var server = http.createServer(function(req, res){// creates server
    if (req.url === '/favicon.ico') {
        res.writeHead(204);
        res.end();
    } else {
        res.writeHead(200, {'Content-Type': 'text/html'});
        var q = url.parse(req.url, true).query//pulls apart the url
        var temp = q.temp;
        res.write(temp);
        res.write(list[2]); //testing artifact displayes them on a browser
        res.end();
    }
}).listen(7474)

server.on('listening', function() {
    console.log('listening on port 7474')
});

在加载页面初始页面后,浏览器向favicon.ico发出了“默认”请求,即只是为每个网页加载图标。该请求将使您的程序崩溃,因为它不包含查询参数`?​​temp =,您目前未在检查该参数。

我提供的解决方案对于生产应用程序不是可行的解决方案,但这显然是一个演示项目,因此它应该可以满足您的用例。

如果您想开发一个更大,更稳定的生产应用程序,则将不得不进行很多重组。如果您不想使用框架,这可能是一个起点。

https://adityasridhar.com/posts/how-to-use-nodejs-without-frameworks-and-external-libraries

我对所有节点应用程序都使用Express框架,这使一些默认配置更快了,并且有成千上万的在线教程可帮助您入门...

https://medium.com/@purposenigeria/build-a-restful-api-with-node-js-and-express-js-d7e59c7a3dfb

  • 我只是在Google上搜索了这些教程作为示例,但是您应该进行自己的研究以找到最合适的。