javascript - nodejs express一个使用问题(和流相关)

查看:72
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆