渲染后如何将流重新写入浏览器

时间:2019-01-31 19:12:06

标签: express templates

我正在尝试在数据到达时将其流式传输到快速渲染的模板。当我不使用模板引擎时,这可以按预期工作。我先呼叫res.write(也可以在呼叫res.writeHead或类似名称之后),然后在完成后呼叫res.end。我什至也可以发送html标签。

TL; DR 我正在使用neo4j-driver npm模块,该模块支持流式传输结果(我需要的)或Promise,它在处理所有结果之前等待所有结果(我不喜欢使用)。我遵循了答案here,该答案引用了指向部分表达式的失效链接(不确定是什么)。在我看来,渲染视图(res.write)之后无法写(res.render)。

这是工作示例(没有模板引擎)

session
    .run('MATCH (n:Movie) return n LIMIT 250')
    .subscribe({
        onNext: (rec) => {
            let frec = {
                id: rec._fields[0].identity.low,
                title: rec._fields[0].properties.title,
                year: rec._fields[0].properties.released.low,
            };
            movieArray.push(rec);
            console.log(frec);
            res.write(JSON.stringify(frec) + '\n\n');
            },
        onCompleted: () => {
            session
                .run('MATCH (n:Person) return n LIMIT 250')
                .subscribe({
                    onNext: (p) => {
                        let fp = {
                            id: p._fields[0].identity.low,
                            name: p._fields[0].properties.name,
                        };
                        console.log(fp);
                        res.write(JSON.stringify(fp) + '\n\n');
                    },
                    onCompleted: () => {
                        session.close();
                        res.end();
                        },
                    onError: (e) => {
                        console.log(e);
                    },
                });
        },
        onError: (err) => {
            console.log(err);
        },

当然,它像这样围绕在路由声明(app.get('/', (req, res) => {}))周围。

PS:我知道最终的解决方案是使用前端JavaScript框架,例如React,Vue和Angular2。但是暂时,我是否可以将数据流传输到ejs或handlebars,以便最初仅显示几条记录(也许),但是随着返回的更多,列表也会增加? 谢谢。

0 个答案:

没有答案