【问题标题】:Calling an async middleware inside of another async middleware in Express.js?在 Express.js 中调用另一个异步中间件内部的异步中间件?
【发布时间】:2022-12-08 06:26:04
【问题描述】:

是否可以在 Express.js 中调用另一个异步中间件内部的异步中间件?

每当我尝试这样做时,它都不会按照我希望的顺序执行。

我希望它们按顺序执行并输出 First, Second, Third

谁能解释为什么或如何实现我想要的目标?

const first = async (req, res, next) => {  
  console.log('First');
  next()
}

const second = async (req, res, next) => {
  await first(req, res, next);
  console.log('Second');
  next();
}

router.get('/logs', second, async (req, res) => {
  console.log('Third');
  res.send('Done');
});

// Console Output:
// First
// Third
// Second

如果我不在second() 内执行first(),它工作得很好,但对于我正在做的事情,我希望能够在另一个内部执行中间件。

const first = async (req, res, next) => {  
  console.log('First');
  next()
}

const second = async (req, res, next) => {
  console.log('Second');
  next();
}

router.get('/logs', first, second, async (req, res) => {
  console.log('Third');
  res.send('Done');
});

// Console Output:
// First
// Second
// Third

【问题讨论】:

    标签: javascript node.js express asynchronous


    【解决方案1】:

    您将 next 传递给了 first 函数,它将调用路由处理程序,而不是 second 代码

    你必须传递一个新的回调

    const first = async (req, res, next) => {  
      console.log('First');
      next()
    }
    
    const second = async (req, res, next) => {
      await first(req, res, () => {
        console.log('Second');
        next();
      });
    }
    
    router.get('/logs', second, async (req, res) => {
      console.log('Third');
      res.send('Done');
    });
    

    或者

    const first = async (req, res, next) => {  
      console.log('First');
      next()
    }
    
    const second = async (req, res, next) => {
      await new Promise(r => first(req, res, r))
      console.log('Second');
      next();
    }
    
    router.get('/logs', second, async (req, res) => {
      console.log('Third');
      res.send('Done');
    });
    

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 2018-09-06
      • 2017-05-27
      • 1970-01-01
      • 2012-07-25
      • 2018-03-19
      • 2022-06-29
      • 1970-01-01
      相关资源
      最近更新 更多