在快速路线内,范围工作有些奇怪

我遇到以下问题:Express路由器中的optionsvariables没有使用正确的optionsvariables。 有什么build议么?

 router.use('/test1', new Factory("test1") ); router.use('/test2', new Factory("test2") ); function Factory(options) { router.use((req,res,next) => { res.json(options) }) return router }; /* Returns : /test1 "test1" /test2 "test1" ??? */ 

 function Factory(options) { return (req,res,next) => { res.json(options) }) }; router.use('/test1', new Factory("test1") ); router.use('/test2', new Factory("test2") ); 

TL;博士;

改用这个。

 router.get("/:options", Factory); function Factory(req, res, next){ const options = req.params.options; res.json(options); } 

为什么你有没有按预期工作

在你的工厂你这样做:

 router.use((req, res, next) => { res.json(options); }); 

这个语句告诉快递:嘿,每当一个请求进来,然后运行这个中间件:

 (req, res, next) => { res.json(options); }) 

请注意,您没有为此指定路由,只是以app.use(handler)的格式,因此它将针对每个请求运行。

在上面,你这样做:

router.get("/test1", new Factory("test30"));

现在当快递看到这个时候,哦,这里是/test1的处理程序,让我注册该处理程序的路线。 当它注册处理程序时,会遇到以下expression式: new Factory("test1") 。 请注意,这是一个expression式,将在路由注册时执行而在处理请求时不会执行。 它基本上可以像这样重写: router.get("/test1", Factory("test30")) ,其结果是:

 router.get("/test1", router.use((req, res, next) => { res.json("test1"); return router; })); 

这部分:

 router.get("/test1", ) 

取决于这个部分:

 router.use((req, res, next) => { res.json("test1"); return router; }) 

这意味着后者将被首先执行。 这意味着在所有的代码看起来像这样:

 const resultOfThisLine = router.use((req, res, next) => { res.json("test1"); //You passed test1 as options to the factory return router; }); router.get("/test1", resultOfThisLine); router.get("/test2", router.use((req, res, next) => { res.json("test1"); //You passed test1 as options to he factory return router; })); 

如你看到的,

  router.use((req, res, next) => { res.json("test1"); //You passed test1 as options to the factory return router; }); 

实际上是在一切之前注册的,因为它返回一个响应,没有别的东西会被调用。 此外,这个处理程序将响应任何请求,因为没有特定的url连接到它。

感谢您的快速反应。 这让我意识到我需要创build一个新的路由器对象。

像这样:

 const express = require('express') const router = express.Router(); router.use('/test1', new Factory("test1")); router.use('/test2', new Factory("test2")); function Factory(options) { const router2 = express.Router(); router2.get("", handleRoute.bind({ options: options })) router2.post("", handleRoute.bind({ options: options })) function handleRoute(req, res, next) { res.json({ message: "hello", options: options }) } return router2 };