首页 > 解决方案 > 如何在expressjs/nodejs中在同一控制器和同一路由下开发多个get路由器功能?

问题描述

我正在将 Express 与 Node 一起使用,并且我的客户端应用程序可以请求与以下类似的 URL

   http://localhost:3008/api/mitems/7
   http://localhost:3008/api/mitems/0/0/20
   http://localhost:3008/api/mitems/7/2/0/20    

这些请求将返回 JSON 响应。

我已将 express 配置为路由如下:

    router.get("/getbyId/:mid", mControllers.getById);
    
    router.get("/:mid/:pNo/:pSize", mControllers.getM);
    
    router.get("/:mid/:mItemId/:pNo/:pSize", mControllers.getMItems);

但这不能正常工作。我不确定如何传递多个参数,也就是说,我不确定这是否是正确的方法。是吗?

节点考虑router.get("/getbyId/:mid", mControllers.getById);每个不同请求的第一个 api,无论是我调用 http://localhost:3008/api/mitems/0/0/20还是 http://localhost:3008/api/mitems/7/2/0/20两种方式。

我应该如何在 nodejs 中重载相同的 API 函数,或者有没有更好的方法来实现这一点?

================================package.json===========================
{
  "name": "A Demos",
  "version": "1.0.0",
  "description": "a Demo",
  "main": "index.js",
  "dependencies": {
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "express-validator": "^6.12.0",
    "handlebars": "^4.7.7",
    "mysql": "^2.18.1",
    "nodemailer": "^6.6.1",
    "nodemon": "^2.0.12"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "test",
  "license": "ISC"
}

错误,我得到了 nodejs 方面

Error: Route.get() requires a callback function but got a [object Undefined]
    at Route.<computed> [as get] (s\node_modules\express\lib\router\route.js:202:15)
    at Function.proto.<computed> [as get] (s\node_modules\express\lib\router\index.js:510:19)
    at Object.<anonymous> (s\routes\menus-routes.js:12:8)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:14)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (s\index.js:16:21)

标签: node.jsexpress

解决方案


Express 按照您将它们添加到的顺序考虑路线router,因此在之前/:mid/:pNo/:pSize考虑。由于请求不仅匹配后者,还匹配前者(带有, , ),它将由. /:mid/:mItemId/:pNo/:pSize/mitems/0/0/20:mid = 'mitems':pNo = '0':pSize = '0'mControllers.getM

因此,在较短(不太具体)的路线之前添加较长(更具体)的路线,例如,

router.get("/getbyId/:mid", mControllers.getById);
router.get("/:mid/:mItemId/:pNo/:pSize", mControllers.getMItems);
router.get("/:mid/:pNo/:pSize", mControllers.getM);

路线是第getbyId一位的,因为这个词getbyId比 placeholder 更具体:mid


推荐阅读