javascript - 带有第二个参数的 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);
解决方案
你已经陷入了困境,你应该改变你的方法,目前你已经完全把一个简单的问题复杂化了,你正在寻找的解决方案在 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
的事情。
推荐阅读
- go - 使用 kubernetes 从不同的服务连接到 Redis 服务
- ios - 如何使用 Swift 将 imageview 中的图像上传到 POST API?
- c++ - 为什么这段代码的输出总是一样的?
- python-3.x - 恢复保存的模型
- php - 使用 PDO 创建的数组中的重复条目
- html - 从数据库中获取数据并将数据附加到框架
- jquery - 使用 jquery 的 Chrome 上的 Flex 无法正确呈现
- javascript - 我们如何获得图像高度(不是自然高度)
- html - 如何在不更改 url 的情况下在另一个组件中路由组件?
- android - 导航抽屉中的水平回收器视图