javascript - nodejs express一个使用问题(和流相关)
问题描述
我在网上查看express相关资料的时候,看到了下面这样的代码(我做了稍微改动,但是原理和关键内容没有变)
const stream = require('stream');
const util = require('util');
const express = require('express');
const http = require('http');
const app = express();
const port = 4000;
util.inherits(StatStream, stream.Readable); // <co id="callout-streams-express-1" />
function StatStream(limit) {
stream.Readable.call(this);
this.limit = limit;
}
StatStream.prototype._read = function() {
if (this.limit === 0) {
// Done
this.push();
} else {
this.push(util.inspect(process.memoryUsage())); // <co id="callout-streams-express-2" />
this.push('\n');
this.limit -= 1;
}
};
app.get('/', (req, res) => {
const statStream = new StatStream(10);
statStream.pipe(res); // <co id="callout-streams-express-3" />
});
const server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
let bind = typeof port === 'string' ?
'Pipe ' + port :
'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
const addr = server.address();
const bind = typeof addr === 'string' ? `pipe ${addr}` : `port + ${addr.port}`;
console.log(bind);
}
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
这段代码个人没看太懂,大致应该是基于流来实现输出。但还是不太懂
另外在chrome中运行,一直是加载中,并没有结果。
在ff中,加载一段时间后取消加载(点击url输入框旁边的叉),可以在控制台看到如下内容(不显示在网页上):
我对整个过程表示非常的疑惑,希望有相关经验的朋友能指点一二,或者解释一些内容和浏览器这种情况是什么意思..谢谢
基础知识。
Node.js的util模块和Stream模块,http模块和express框架。
解答3个注释。
<co id="callout-streams-express-1" />那一行。util.inherits(A, B)是Node.js原生util模块的继承方法,实现A继承B,并且结合下两行B.call(A)使用更好;
<co id="callout-streams-express-2" />那一行。util.inspect(Object)是Node.js原生util模块的对象转字符串的方法,基本等价于JSON.stringify();
<co id="callout-streams-express-3" />那一行。是使用Stream模块的管道方法,从读取流直接传输到写入流;
解决问题。
chrome一直运行中,是因为pipe()管道方法无法判断读取流已经写入完毕,http链接无法结束,也就没办法加载。需要在代码中pipe(null)显式指定读取流读取结束,然后写入流才会知道写入结束。
if (this.limit === 0) {
// Done
this.push(null);
}
最后安利一本书《Node.js硬实战》。
soonfy
这篇关于javascript - nodejs express一个使用问题(和流相关)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!