Javascript nodejs router.route包含所有异步中间件,路由器本身是异步的吗?

Javascript nodejs router.route包含所有异步中间件,路由器本身是异步的吗?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一个路由器,可以运行几个中间件。看起来是这样的 router.route(“/”).get(某物,某物,另一物) 函数something,something,one-more都是异步的。“还有一件事”会返回一个响应 这是否意味着整个router.route()是异步的。或者我需要把它换成 router.get('/', async (req, res) => { try { await something await something_else resul

我有一个路由器,可以运行几个中间件。看起来是这样的

router.route(“/”).get(某物,某物,另一物)

函数something,something,one-more都是异步的。“还有一件事”会返回一个响应

这是否意味着整个router.route()是异步的。或者我需要把它换成

router.get('/', async (req, res) => {
  try {
    await something
    await something_else
    results = await one_more_thing
    res.json(results)
  } catch (err) {
    res.send(err);
  }
});
更新::添加实际代码

这是我的路由器。路由呼叫

    router.route('/clock_in').post(timeClockValidator, isManager, startingOnTime, isClockedIn, clockIn);
这是时钟验证器

export const timeClockValidator = async (req, res, next) => {
  logger.info('validating time clock json.');

  let schema = '';
  let results = { errors: [] };

  req.originalUrl === '/api/timeclock/clock_in'
    ? (schema = time_clock_schema)
    : (schema = schema);

  try {
    results = await v.validate(req.body, schema);
  } catch (error) {
    logger.error(error);
    return res.status(400).json('Error");
  }

  return results.errors.length !== 0
    ? (logger.error(results.errors),
      res.status(400).json("Error")
    : next();
};
其余功能的设置方式相同

nodejs router.route包含所有异步中间件,路由器本身是异步的吗

是的,如果处理传入请求所涉及的任何中间件或处理程序的任何部分都是异步的,那么结果将以异步方式交付(在事件循环的某个未来标记上)。“异步”通常被称为“传染性”,因为一旦代码链中的任何内容是异步的,那么整个结果就变成异步的,因为一旦链的任何部分延迟到事件循环的某个未来滴答声,那么最终结果将始终延迟到事件循环的某个未来滴答声

这有点像一次旅行,包括坐四列不同的火车。如果一列火车坏了,你被困了24小时,那么你在旅途中的所有后续火车上也将至少晚点24小时

使用异步操作的中间件函数与未专门设计为中间件函数的普通
async
函数之间存在差异

做一些类似于:

router.route("/").get(something, something_else, one_more_thing)
something
something
都必须接受
(req,res,next)
等参数,并且在完成后必须调用
next()
,以便继续执行此路由列表中的下一个处理程序。它们可以是同步的,也可以是异步的,只要它们在前进到下一个中间件时调用
next()
,或者通过不调用
next()
发送响应并停止进一步的路由

这需要一个完全不同于运行以下内容的功能:

router.get('/', async (req, res) => {
  try {
    await something
    await something_else
    results = await one_more_thing
    res.json(results)
  } catch (err) {
    res.send(err);
  }
});
如果
something()
something\u else()
返回这样的承诺,那么您不能以第一种形式使用这些函数-您只能这样使用它们


所以,这就是为什么我非常不喜欢这些没有伪代码和真实代码的理论问题(它们对每个人来说效率都很低)。如果您向我们展示了
something()。。您提供的代码应该可以工作,这就是我所指的。那么第一个代码段可以吗?哦,但是因为我在我的server.js中使用这个router.route,而且router.route不是异步的,这意味着每次我运行这个特定的路由时,我都会阻塞线程?目前,something()和something_else()都接受req、res、next,它们调用next(),或者在出现问题时返回res。也许这只是我的一个糟糕的设计,我应该改变一些东西()和一些东西(),使之更符合第二个例子。@PhilipJayFry-那么它们只能在第一种形式下工作(express infrastructure将它们视为中间件,在第二种形式下根本不起作用。而且,等待一个不返回承诺的函数也没有任何用处。谢谢。我理解这一点,我只是好奇有什么更好。也许它们都很好?@PhilipJayFry-嗯,相同的函数在第二种形式下不起作用这两种情况。你是在问你是否重写了
something()
something\u else()
返回承诺,然后以第二种形式使用它们?很抱歉,我的问题可能不太清楚。我正在尝试决定哪种方式更好,我不想阻止事件循环。如果在第一个示例中,事件循环在router.route中保持畅通,那么如果router.route本身不是asyc,则应该可以阻止事件循环,然后我宁愿现在重写所有代码以避免将来出现问题。我有一个server.js文件正在调用router.route,如果这很重要的话。js文件router.route也存在于一堆其他路由器中,因此我的server.js导入1文件,并可以处理多个调用。