具有多个文件的简单nodejs示例

问题描述:

我在NodeJS上编写了非常简单的项目。我想与其他语言编程示例(如java)相似。所以我做:server.js,main.js和模块(calc.js)。以下是他们的代码:具有多个文件的简单nodejs示例

文件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; 
    }; 
}()); 

我在我的服务器上运行它,我得到了一个错误:

Server running at http://127.0.0.1:8080/ _http_outgoing.js:558 throw new TypeError('First argument must be a string or Buffer'); ^

TypeError: First argument must be a string or Buffer at ServerResponse.OutgoingMessage.end (_http_outgoing.js:558:11) at Object.exports.main (D:\workspace\FirstNodeJS\main.js:7:6) at Server. (D:\workspace\FirstNodeJS\server.js:5:7) at emitTwo (events.js:106:13) at Server.emit (events.js:191:7) at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:546:12) at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)

我只是一个新手的NodeJS。

有2个问题到您的问题。

第一个问题是NodeJS响应对象的`.write(...)API需要一个字符串缓冲区或字符串。

报价:

response.write(chunk[, encoding][, callback])

chunk < string > | < Buffer >

encoding

callback Returns:

参见:https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

你的计算方法PlusMinus正在返回整数。因此,您需要在写入之前将数字转换为字符串;

实施例:

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你的结果,使输出看起来像;

enter image description here

如果没有这将是一个衬垫,14-4

+0

你能告诉我你用于dev nodejs的工具吗? (在你的截图中) –

+0

@TerryJohn那是邮递员。请参阅:https://www.getpostman.com/ –

res.end()期望第一个参数是字符串或缓冲区。你正在传递一个数字。这是如何在文档here中描述的。

你可以这样做:

res.end(calc.Plus(a,b).toString()); 

此外,您可以只在一定的响应呼吁res.end()一次。如果您想要将多件事情作为响应的一部分发送,可以在使用res.end()之前将它们全部组合成一个字符串,或者可以多次拨打res.write(),然后用res.end()完成。