首页 > 解决方案 > 带有第二个参数的 app.use 的 async.parallel

问题描述

我使用express v4.17.1并且想让我的 app.use() 中间件并行运行。

所以我在网上找到了一些例子。

例子:

function runInParallel() {
  async.parallel([
    getUserProfile,
    getRecentActivity,
    getSubscriptions,
    getNotifications
  ], function(err, results) {
    //This callback runs when all the functions complete
  });
}

但我在我的应用程序中拥有的是:

const app = express();
const APP_FOLDER = "bdt";

app.use(httpContext.middleware);
app.use(metricsMiddleware);
app.use(rtEndMiddleware);
app.use(trackingContextMiddleware);
app.use(healthRoutes());

app.use("/" + APP_FOLDER + "/api/products", productsRoutes);
app.use("/tcalc/" + APP_FOLDER + "/api/products", productsRoutes);

productRoutes 是这样的:

const jsonParser = bodyParser.json({
  limit: "1mb",
});

const accessFilter = accessFilterMiddleware(Registry.list());
const localDevFilter = localDevFilterMiddleware(Registry.list());

const apiRoutes: Router = Router();


apiRoutes.get("/", listProducts);
apiRoutes.get("/healthz", cProductHealth);
apiRoutes.get("/:id", accessFilter, localDevFilter, fetchProductData);
apiRoutes.post(
  "/:id",
  accessFilter,
  localDevFilter,
  jsonParser,
  fetchProductData,
);
apiRoutes.get(
  "/:id/fields/:fieldId/options",
  accessFilter,
  localDevFilter,
  fetchProductOptions,
);
apiRoutes.post(
  "/:id/loadmoreoptions",
  accessFilter,
  localDevFilter,
  jsonParser,
  loadMoreOptions,
);
apiRoutes.post("/:id/ploy", accessFilter, jsonParser, fetchMultipleProductData);
apiRoutes.post(
  "/:id/gxx",
  accessFilter,
  localDevFilter,
  jsonParser,
  fetchGssData,
);
apiRoutes.get("/:id/healthz", collectProductHealth);

我认为对于第一个应该很容易:

async.parallel([
  httpContext.middleware,
  metricsMiddleware,
  rtEndMiddleware,
  trackingContextMiddleware,
  healthRoutes()
], function(err, results) {
  //This callback runs when all the functions complete
});

但我的问题是:在这种情况下,如何使用第二个参数(productRoutes)来做到这一点?

app.use("/" + APP_FOLDER + "/api/products", productsRoutes);
app.use("/tcalc/" + APP_FOLDER + "/api/products", productsRoutes);

标签: javascriptexpressasync.js

解决方案


你已经陷入了困境,你应该改变你的方法,目前你已经完全把一个简单的问题复杂化了,你正在寻找的解决方案在 javascript 中是不可能的。

如果您想在 express 中创建路由,则不要app.use用于所有内容,它应该仅用于中间件或注册路由器,您可以在其上定义路由。

你应该使用:

app.get('/', () => ...

定义您的路线。或者,您也可以通过以下方式使用路由器:

app.use(router)

...

router.get('/', () => ...

不仅如此,如果您想async在 javascript 中定义或“并行”路由,那么只需像平常一样定义异步回调,删除您所做的大部分内容。

app.get('/', async () => ...

现在这是一条异步执行的路由。

您还应该注意不要乱用 express 中间件,因为您会弄乱现有的中间件(如错误路由)。

更重要的是,您所指的库只是一个具有简洁功能的辅助库,它不会从根本上改变 javascript 的工作方式。当您调用异步函数时,它将被添加到事件队列中,并且仍然以串行的方式一个接一个地同步执行,真正的多线程是不可能的,除了服务工作者和浏览器 API 调用临时在它们自己的单个线程中执行, 在被添加到事件队列之前。

您正在寻找的只是一个简单的: router.get('/', async () => ...,这是您能做的最好的事情,看起来您的所有路线都在并行执行。

在您声明了其中的多个之后,您可以使用类似Promise.all. 我最好的猜测是,这也是类似parallel的事情。


推荐阅读