gpt4 book ai didi

javascript - NodeJS 处理发布文件并返回文件

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:44 25 4
gpt4 key购买 nike

所以,我一直在玩NodeJS,我想做的是接收客户端发送的文件,处理该文件(不保存它,需要逐行处理),然后将处理结果作为文件下载发送。

所以我有以下路线:

app.post('/processFile', function(req, res) {
var file = req.files.file;

//Process file inline
process.processFile(file, req).then((data) => {
//res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'text/plain');
res.setHeader('Content-Disposition', 'attachment; filename=tokenized.txt');
res.write(data, 'binary');
res.end();
}).catch((err) => {
res.send(err);
});

});

processFile 函数如下所示:

processFile: function(file) {
return new Promise(function(resolve, reject) {
var lineReader = require('readline').createInterface({
input: fs.ReadStream(file)
});

var output = "";
lineReader.on('line', function(line) {
// Tokenize each line
DoSomethingFunction(line).then((data) => {
output += data + "\n";
}).catch((err) => {
reject(`Error in line [${line}].`);
});
});

resolve(output);
});
}

当我测试它时,它什么也没做。我只是得到一个空响应,我做了一些测试并注意到该路由从 processFile() promise 中获取了拒绝(),但它没有消息。经过更多测试后,我注意到:

var lineReader = require('readline').createInterface({
input: fs.ReadStream(file)
});

不工作,并且是发送“拒绝”的人。

有什么问题吗?

最佳答案

问题在于 lineReader 正在使用异步事件来收集其信息。

基本上,这意味着您在行读取器处理任何数据之前调用resolve(output)。相反,您需要监听另一个事件:the 'close' event 。这表示行读取器已完成。

lineReader.on('close', () => {
resolve(output);
});

不过有一点需要注意。您的 DoSomethingFunction 似乎也是异步的。这意味着当“关闭”事件运行时它可能正在等待做一些工作。处理此问题的一种方法是保存 DoSomethingFunction 的最新结果并将其附加到“close”事件中。

// Initialize to a resolved promise just in case you don't receive
// any data from the user
let doSomethingPromise = Promise.resolve();

lineReader.on('line', (line) => {
doSomethingPromise = DoSomethingFunction(line)
.then((data) => {
output += data + '\n';
})
.catch((err) => {
reject(`Error in line [${line}].`);
});
});

lineReader.on('close', () => {
// Wait for the DoSomethingFunction to finish
doSomethingPromise.then(() => resolve(output));
});

关于javascript - NodeJS 处理发布文件并返回文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50179997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com