Node.js 如何仅在nodejs上的mv库完成后发送响应。用承诺包装并不意味着';行不通

Node.js 如何仅在nodejs上的mv库完成后发送响应。用承诺包装并不意味着';行不通,node.js,Node.js,我正在尝试设置一个端点,该端点通过一个多部分post请求获取一个文件,并使用命令和命令将其保存到一个特定的目录中。然后在保存完所有文件后,我想用该目录中所有用于渲染的文件的列表来响应。问题是,响应似乎是在目录列表更新之前发送的。我试图将mv操作包装成一个承诺,然后在一个then块中做出响应,但没有效果。任何帮助都将不胜感激 app.post("/api/v1/vendor/:id/menu", (req, res, next) => { const id = req

我正在尝试设置一个端点,该端点通过一个多部分post请求获取一个文件,并使用命令和命令将其保存到一个特定的目录中。然后在保存完所有文件后,我想用该目录中所有用于渲染的文件的列表来响应。问题是,响应似乎是在目录列表更新之前发送的。我试图将mv操作包装成一个承诺,然后在一个then块中做出响应,但没有效果。任何帮助都将不胜感激

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我应该提到我也尝试过异步等待。从我的理解来看,这两者在功能上没有什么不同,它是纯语法的。谢谢