Node.js 如何仅在nodejs上的mv库完成后发送响应。用承诺包装并不意味着';行不通
我正在尝试设置一个端点,该端点通过一个多部分post请求获取一个文件,并使用命令和命令将其保存到一个特定的目录中。然后在保存完所有文件后,我想用该目录中所有用于渲染的文件的列表来响应。问题是,响应似乎是在目录列表更新之前发送的。我试图将mv操作包装成一个承诺,然后在一个then块中做出响应,但没有效果。任何帮助都将不胜感激Node.js 如何仅在nodejs上的mv库完成后发送响应。用承诺包装并不意味着';行不通,node.js,Node.js,我正在尝试设置一个端点,该端点通过一个多部分post请求获取一个文件,并使用命令和命令将其保存到一个特定的目录中。然后在保存完所有文件后,我想用该目录中所有用于渲染的文件的列表来响应。问题是,响应似乎是在目录列表更新之前发送的。我试图将mv操作包装成一个承诺,然后在一个then块中做出响应,但没有效果。任何帮助都将不胜感激 app.post("/api/v1/vendor/:id/menu", (req, res, next) => { const id = req
app.post("/api/v1/vendor/:id/menu", (req, res, next) => {
const id = req.params.id;
const form = formidable({ multiples: true, keepExtensions: true });
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
if (!Array.isArray(files.image)) {
files = [files.image];
}
let filelist;
const proms = files.map((file) => {
const dst = `pics/${id}/${file.name}`;
new Promise((resolve, reject) => {
mv(file.path, dst, { mkdirp: true }, (err) => {
if (err) {
console.error("error: ", err.status);
reject(err);
}
console.log("done moving");
resolve();
});
});
});
Promise.all(proms).then(() => {
console.log('now reading dir...');
filelist = fs.readdirSync("pics/" + id);
res.send(filelist);
});
});
});
我认为我们错过了
新承诺
之前的返回
关键工作。您可以检查proms
变量是否包含承诺列表
const proms = files.map((file) => {
const dst = `pics/${id}/${file.name}`;
new Promise((resolve, reject) => {
mv(file.path, dst, { mkdirp: true }, (err) => {
if (err) {
console.error("error: ", err.status);
reject(err);
}
console.log("done moving");
resolve();
});
});
});
对我来说,应该是:
const proms = files.map((file) => {
const dst = `pics/${id}/${file.name}`;
return new Promise((resolve, reject) => {
mv(file.path, dst, { mkdirp: true }, (err) => {
if (err) {
console.error("error: ", err.status);
reject(err);
}
console.log("done moving");
resolve();
});
});
});
而不是将逻辑写入.then()中。在此处使用[async/await][1]。上面代码中发生的事情是在第3行之后,我相信它会立即返回。示例:[1]:@MithiridiPrasanth我应该提到我也尝试过异步等待。从我的理解来看,这两者在功能上没有什么不同,它是纯语法的。谢谢