NodeJS将请求主体转换为大写并返回响应

时间:2015-07-22 18:42:08

标签: node.js sails.js

使用下面的代码我计划将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]);

3 个答案:

答案 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);