我在NodeJS上写了一个非常简单的项目。我想与其他语言编程示例相似,例如java。所以我制作:server.js,main.js和module(calc.js)。这是他们的代码:
文件server.js
var main = require('./main');
var http = require('http');
http.createServer(function(req, res){
main.main(req, res);
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
档案main.js
var calc = require('./calc');
exports.main = function(req, res){
var a = 5;
var b = 9;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(calc.Plus(a,b));
res.end(calc.Minus(a,b));
};
文件calc.js
(function(){
module.exports.Plus = function(a, b){
return a+b;
};
module.exports.Minus = function(a, b){
return a-b;
};
}());
我在我的服务器上运行它,我收到一个错误:
在http://127.0.0.1:8080/运行的服务器 _http_outgoing.js:558 抛出新的TypeError('第一个参数必须是字符串或缓冲区'); ^
TypeError:第一个参数必须是字符串或缓冲区 在ServerResponse.OutgoingMessage.end(_http_outgoing.js:558:11) 在Object.exports.main(D:\ workspace \ FirstNodeJS \ main.js:7:6) 在服务器上。 (d:\工作空间\ FirstNodeJS \ server.js:5:7) 在emitTwo(events.js:106:13) 在Server.emit(events.js:191:7) 在HTTPParser.parserOnIncoming [as onIncoming](_http_server.js:546:12) 在HTTPParser.parserOnHeadersComplete(_http_common.js:99:23)
我只是NodeJS的新手。
答案 0 :(得分:2)
res.end()
期望第一个参数是字符串或缓冲区。你正在传递一个号码。这就是文档here中描述的方式。
你可以这样做:
res.end(calc.Plus(a,b).toString());
此外,您只能针对特定回复致电res.end()
一次。如果您想在响应中发送多个内容,可以在使用res.end()
之前将它们全部合并为一个字符串,也可以多次调用res.write()
,然后使用res.end()
完成
答案 1 :(得分:1)
您的问题有两个问题。
第一个问题是来自NodeJS的响应对象的`.write(...)API接受字符串缓冲区或字符串。
<强>引用:强>
response.write(chunk [,encoding] [,callback])
chunk&lt; 字符串&gt; | &LT; 缓冲区&gt;
编码
回调返回:
请参阅: https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback
您的计算方法Plus
和Minus
正在返回整数。因此,您需要在写入之前将Numbers转换为String;
示例:
var calc = require('./calc');
exports.main = function(req, res){
var a = 5;
var b = 9;
res.writeHead(200, {'Content-Type': 'text/plain'});
var result = calc.Plus(a,b);
res.write(result.toString());
res.write("\n");
result = calc.Minus(a,b);
res.write(result.toString());
res.end();
};
另外,问题2是你应该只为每个响应对象调用.end(...)
一次。
您应该构建结果然后调用它。或者根据需要多次致电.write(...)
,当您满意时,请致电.end(...)
来关闭通讯。
另外,您可能希望将结果换行\n
,以便输出看起来像;
如果不是,它将是一个班轮,14-4
。