如何创建Node.js流服务器

时间:2015-10-27 05:19:30

标签: node.js http stream

我正在尝试创建一个发送事件流的服务器。我创建了一个可读流,我试图按下以响应按键,这样我就可以控制事件流来发送给客户端。

var Readable = require('stream').Readable
var rs = new Readable()

var server = http.createServer(function(req, res) {
    rs.pipe(res)
})
server.listen(8888)

keypress(process.stdin)
process.stdin.on('keypress', function (ch, key) {
    if( key && key.name === 'up' ) {
        rs.push('up key')
    }
}

当我按下向上键时,我明白了:

events.js:85
      throw er; // Unhandled 'error' event
            ^ Error: not implemented
    at Readable._read (_stream_readable.js:464:22)
    at Readable.read (_stream_readable.js:341:10)
    at maybeReadMore_ (_stream_readable.js:449:12)
    at _stream_readable.js:439:7
    at process._tickCallback (node.js:355:11)

我甚至不知道是什么events.js。这不是我的代码。

我希望发生的是字符串up key将从服务器流中发出。我做错了什么?

1 个答案:

答案 0 :(得分:0)

事实证明,我真正想要的是一个分块响应,它没有预先声明响应的Content-Length。这允许节点服务器保持连接打开,定期写入。

var streamResponse

var server = http.createServer(function(req, response) {
    response.setHeader('Content-Type', 'text/html; charset=UTF-8');
    response.setHeader('Transfer-Encoding', 'chunked');
    streamResponse = response
})

server.listen(44445)


setTimeout(function(){
    streamResponse.write('this is a chunk');
}, 5000)

我认为Node默认使用chunked transfer,但关键部分是调用response.write()而不是response.send()。当没有其他内容可以发送时,您可以调用response.end()。

注意:我可能在Node和什么是Express之间存在一些混淆。如果您遇到任何问题,那可能就是一个开始的地方。