我已经在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
答案 0 :(得分:0)
发布一个可能不是 答案的答案,以解释@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
),那么您的问题就出在其他地方。在这种情况下,请提供有关“有时一个文件已损坏”的更多信息:文件是否不完整?服务器显示错误吗?客户端收到错误?在后一种情况下,发生什么错误?
答案 1 :(得分:0)
这对我有用
let media = req.files;
for (let pos in media) {
media[pos].mv(`./media/${renameFile}`, (err) => {
if (err) {
return res.status(500).json({
ok: false,
err
});
}
});
}