【问题标题】:nodejs url parse returns an extra undefined objectnodejs url解析返回一个额外的未定义对象
【发布时间】:2019-01-22 23:53:22
【问题描述】:

我正在编写一个节点 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

这是为什么呢?我该如何补救这种情况?

【问题讨论】:

    标签: node.js http url


    【解决方案1】:

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

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

    "如果指定了data,则相当于调用response.write(data, encoding)后跟response.end(callback)。"

    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 上搜索了这些教程作为示例,但您应该自行研究以找到最合适的。

    【讨论】:

    • 啊,你是对的错误,但实际上最初的请求完成得很好。查看我的编辑了解更多信息
    • 谢谢。我现在正在测试它,当我运行脚本时,它会从控制台日志中返回以下内容:` 监听端口 7474 29 监听端口 7474` 你知道这是否会以任何方式影响脚本吗?或者是什么原因造成的?
    • 当您说返回时,您的意思是在您的浏览器或日志中?我删除了console.logs()
    • 它应该在您的浏览器中返回291。先写29再写1
    • 不,你应该把它留在那里,这是一个标准约定,用于识别你的服务器何时启动并且是调试/监控节点应用程序的必要条件
    猜你喜欢
    • 2020-03-03
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多