gpt4 book ai didi

javascript - 使用 express-fileupload 在 NodeJs 中上传文件无法正常工作

转载 作者:行者123 更新时间:2023-12-02 00:24:01 25 4
gpt4 key购买 nike

我在 NodeJs 中制作了一个用于文件上传的 REST API 工作正常,但有一个问题,如果我上传多于 2 张图片,则只有 2、3 张被上传,有时 1 张被损坏。我认为我的 Loop 运行速度太快了。打击是我的代码:

app.post('/img-upload', function(req, res) {
if (!req.files)
return res.status(400).send({"status":"false", "data":"Image Not Found"});

// Use the mv() method to place the file somewhere on your server
for(var key in req.files) {

thisFile = req.files[key];
let name = +new Date();
thisFile.mv('./images/' + name++ +'.png', function(err) {
if (err) {
res.send(err);
}

});

}
res.json({"status":"File uploaded!"});
});

使用的模块:express-fileupload

最佳答案

发布一个可能不是答案的答案,以解释@PatrickRoberts 似乎有道理的评论。

thisFile.mv 显然是异步工作的,这意味着 function(err){...} 可能会在 res 之后运行。 json(...) 和以下隐式 return

虽然 Node 不应该终止剩余的异步进程,但无论如何,您现在还不能告诉用户文件已成功上传。 (您可以发送该成功信息,然后您的一个回调会抛出一个错误...但为时已晚,您无法将该错误发送给客户端。)

两个选项来解决这个问题。

一个不错的选择

等待所有回调完成后发送成功结果。大概是这样的:

let uploads = [];
for (let k in req.files) {
req.files[k].mv('/my/path/to.png', function(err) {
let promise = new Promise(function(resolve, reject) {
if (err) {
reject(err);
} else {
resolve();
}
});
uploads.push(promise);

})
} // end for loop
Promise.all(uploads).then(function() {
res.json({"status":"File uploaded!"});
}).catch(function(err) {
res.send(err);
});

一个让我感到羞愧的缓慢选项

如果这不能解决问题,假设@PatrickRoberts 发现了正确的问题,您可以尝试按顺序上传,例如:

function processFile() {
let file = req.files.shift()
if (!file) return; // stop sequence condition
file.mv('/my/path/to.png', function(err) {
if (err) {
res.send(err);
} else {
processFile();
}
})
}
processFile(); // start the recursive and sequential "loop"

如果这些都不起作用(第二个错误的选项很慢,但可以清楚地证明是否涉及 res.json/res.send),那么您的问题位于别处。在这种情况下,请提供有关“有时一个已损坏”的更多信息:文件是否不完整?是服务器显示错误吗?客户端收到错误?在后一种情况下,什么错误?

关于javascript - 使用 express-fileupload 在 NodeJs 中上传文件无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54366508/

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