我正在编写一个节点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
那是为什么?而我该如何纠正这种情况?
答案 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