NodeJS ExpressJs -在响应之前等待多个promise完成

ztigrdn8  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(158)

我有一个POST API,里面有一些逻辑,如下所示:

app.post('/', async (req: Request, res: Response) => {
     const tasksRequest = req.body as TasksRequest;
     let tasks: Promise<any>[] = []

     tasks = tasksRequest.tasks.map((t) => processTask(t, tasksRequest.configs));
     await Promise.all(tasks);
  });

下面是processTask函数:

function processTask(task: Task, configs: Configs) {
  return new Promise<void>((resolve, reject) => {
    try {
      const fileName = './output/' + task.tag + 's.json';

      fetch(configs.Host + configs.APIsBasePrefix + task.parentResource + task.mostRelatedPath, {
        method: 'GET'
      }).then(result => {
        result.json().then(jsonResult => {
          fs.writeFile(fileName, JSON.stringify(jsonResult), function () {
            console.log('finished writing :' + fileName);
            resolve();
          });
        }).catch(err => reject(err));
      }).catch(err => reject(err));

    } catch (err) {
      console.log(err);
    }
  });
}

问题是我不能让我的服务器在使用await Promise.all(tasks);发送回响应之前等待所有的promise完成
我尝试了很多东西,这是我最新的方法。我还漏了什么吗
先谢谢你了!
我多次修改了我的实现,使用了像fs.promise这样的库,但没有成功。
更新:
我还尝试了下面的方法来使代码更可读:

app.post('/',  (req: Request, res: Response) => {
  const tasksRequest = req.body as TasksRequest;
  let tasks = []

  tasks = tasksRequest.tasks.map( (t) =>  processTask(t, tasksRequest.configs));

  //const temp = (processTask(tasksRequest.tasks[0],tasksRequest.configs));
  console.log(tasks);
  Promise.all(tasks).then(res=>{
    console.log('After awaiting');
  });
  

});

async function processTask(task: Task, configs: Configs) {
  try {
    const fileName = './output/' + task.tag + 's.json';

    const result = await fetch(configs.Host + configs.APIsBasePrefix + task.parentResource + task.mostRelatedPath, {
      method: 'GET'
    });

    const jsonResult = await result.json();
    return fs.promises.writeFile(fileName, JSON.stringify(jsonResult));

  } catch (err) {
    console.log(err);
  }
}
wlzqhblo

wlzqhblo1#

这是我看到的问题,不知道能不能帮到你。如果仍然有问题,最好进行调试。最好提供日志
1

function processTask(task: Task, configs: Configs) {
  return new Promise<void>((resolve, reject) => {
    try {
      const fileName = './output/' + task.tag + 's.json';

      fetch(configs.Host + configs.APIsBasePrefix + task.parentResource + task.mostRelatedPath, {
        method: 'GET'
      }).then(result => {
        result.json().then(jsonResult => {
          // fs.writeFile(fileName, JSON.stringify(jsonResult), function () {
          fs.writeFile(fileName, JSON.stringify(jsonResult), function (err) {
            if(err){
              reject(err)
            }else{
              console.log('finished writing :' + fileName);
              resolve();
            }
          });
        }).catch(err => reject(err));
      }).catch(err => reject(err));

    } catch (err) {
      console.log(err);
    }
  });
}

2

// app.post('/',  (req: Request, res: Response) => {
app.post('/', async  (req: Request, res: Response) => {
  const tasksRequest = req.body as TasksRequest;
  let tasks = []

  tasks = tasksRequest.tasks.map( (t) =>  processTask(t, tasksRequest.configs));

  //const temp = (processTask(tasksRequest.tasks[0],tasksRequest.configs));
  console.log(tasks);
//  Promise.all(tasks).then(res=>{
 await Promise.all(tasks).then(res=>{
    console.log('After awaiting');
  });
  

});

相关问题