在node.js express中按部件发送数据
我在网上和文档中搜索在node.js express中按部件发送数据,node.js,express,Node.js,Express,我在网上和文档中搜索node.jsexpress模块,似乎没有办法按部件发送数据。我有一个文件渲染不是很快,我想发送它的一部分之前,一切渲染 下面是我的问题: 在响应上是否有按部件发送数据的方法 response.end()的作用是什么 如果无法按部件发送数据,那么背后的原理是什么?如果这是真的,我会说它看起来更像是阻塞而不是非阻塞。如果数据提前提供,浏览器可以更快地加载信息 简化代码示例: app.get(..) { renderFile(file, function(data) {
node.js
express
模块,似乎没有办法按部件发送数据。我有一个文件渲染不是很快,我想发送它的一部分之前,一切渲染
下面是我的问题:
响应
上是否有按部件发送数据的方法response.end()的作用是什么
app.get(..) {
renderFile(file, function(data) {
response.send(data);
});
response.end();
)
这段代码只发送第一块数据。我检查了-数据给出正确,并且多次调用回调
当然,我可以将数据附加到一个变量中,然后编写
response.send(data)
但是我不喜欢这种方法-它不是应该工作的方式。响应对象是一个可写流。只需写入它,Express甚至会自动为您设置分块编码
response.write(chunk);
如果创建这个“文件”的任何东西都以可读流的形式出现,那么您也可以通过管道连接到它 Express扩展了Connect,我相信它扩展了HTTP。看一下,您要查找的似乎是,它需要一大块数据作为响应体发送。我相信您可以使用结束信号。响应对象可以写入。在您的情况下,以下是一个解决方案:
renderFile(file, function(data) {
response.send(data);
});
response.end();
如果您有机会将文件作为流获取,则可以进一步简化:
file.getReadableStream().pipe(response);
实现这一点的简单方法是将数据转换为可读的流,并通过管道将其传输到响应对象。 这是我的nodejs代码。希望这能有所帮助
var express= require('express');
var bodyParser = require('body-parser');
const JSONStreamStringify = require('json-stream-stringify');
var app=express();
var jsonParser = bodyParser.json();
app.post('/node_test_pipe', jsonParser, function (req, res) {
console.log("Request from:"+req.url);
var obj={
my:1,
two:2
}
JSONStreamStringify(obj).pipe(res);
var obj={
my:3,
two:4
}
JSONStreamStringify(obj).pipe(res);
});
app.listen(8080);
除了使用
Response.write()
方法分块发送和Response.end()
标记结束之外
如果你有一条小溪!您可以将它直接输送到响应对象!所有这些都会自动处理
有关文件可读流,请参见下面的示例:
var http=require('http');
var fs=需要('fs');
http.createServer(函数(req,res){
//文件名在本地目录中很简单,并固定在请求的url上
var filename=\uuuu dirname+req.url;
//此行将文件作为可读流打开
var readStream=fs.createReadStream(文件名);
//这将一直等到我们知道可读流实际上是有效的,然后再进行管道传输
readStream.on('open',函数(){
//这只是将读取流通过管道传输到响应对象(该对象将发送到客户端)
readStream.pipe(res);//请详细说明管道并给出一个例子。我觉得这对很多人来说都非常相关,因为在很多情况下,它实际上是一个更好的解决方案。@NielsAbildgaard我不能给出一个具体的例子,因为问题中的代码没有提供任何关于数据来源的上下文。sourceStream.pipe(response)
就可以了。
const fs = require('fs');
const r = fs.createReadStream('file.txt'); // read stream
const z = zlib.createGzip(); // write stream
const w = fs.createWriteStream('file.txt.gz'); // write stream
r.pipe(z).pipe(w);