使用下面的代码我计划将req主体转换为大写并返回res并且还打印stdout,当我测试res从未被提取,并且http连接永远存在。请有人在这里指出错误。
var http =require('http');
var fs = require('fs');
var through = require('through2');
var server = http.createServer(function(req,res){
if(req.method==='POST'){
req.pipe(through(function(buffer,encoding,next){
//console.log()
this.push(buffer.toString().toUpperCase());
next();
})).pipe(process.stdout).pipe(res) // If remove .pipe(process.stdout) then I get response.
}
//res.end(); -- If I enable this I do get a blank response with 200 OK
})
server.listen(process.argv[2]);
答案 0 :(得分:5)
var http =require('http');
var fs = require('fs');
var through = require('through2');
var bunyan = require('bunyan');
var log = bunyan.createLogger({ name: 'http' });
var server = http.createServer(function(req, res) {
// log.info({'req: ': req});
if(req.method==='POST') {
var dataUpper = {};
req.on('data', function(chunk) {
var dataString = chunk.toString();
dataUpper = dataString.toUpperCase();
log.info({"received body data": dataUpper });
});
req.on('end', function() {
res.writeHead(200, "OK", {'Content-Type': 'text/plain' });
res.end(dataUpper);
});
}
});
server.listen(3001, 'localhost');
console.log('listening on port 3001');
这应该有效。您可以使用console.log样式消息替换任何log.info。从未使用过。
答案 1 :(得分:0)
这是我如何解决这个问题的。 +1给Evan建议bunyan,我喜欢。我认为这对Evan的解决方案略有改进,因为:
1)它始终使用ES6函数语法。
2)它使用through2-map来处理数据块的负担。它似乎是一个围绕through2的包装器模块,具有更简单的语法。它只需一个函数,并返回一个流,因此您可以通过将输出流直接传送到响应流来将其用作中间人流。你传递的函数需要一段数据(我认为你的整个请求),并让你在返回整个结果之前一次性完成所有工作。
3)我认为通过包含错误处理并避免将所有逻辑包装在一个大的if块中来处理非POST请求更好。
// hook up all my modules
var http = require('http')
var transformer = require('through2-map')
var bunyan = require('bunyan') // cool logger module
// locals
var listenPort = process.argv[2]
var logger = bunyan.createLogger({name: "http"})
var server = http.createServer((req, res) => {
// check for POST method
if (req.method !== 'POST') {
logger.error('405: Method Not Allowed')
res.writeHead(405)
res.end();
}
// pipe the request data into the transformer...
req.pipe(transformer((chunk) => {
// do the transformation with the chunk
// add a newline to avoid that weird '%' char at the end
return (chunk + '\n').toString().toUpperCase()
})).pipe(res) // then pipe the result to the response stream
})
server.listen(listenPort)
答案 2 :(得分:-1)
var http = require('http');
var uc = require('upper-case');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(uc("Hello World!"));
res.end();
}).listen(8080);