我在 Node 中使用 Express 并且我有一个要求,我的客户端应用程序可以请求与以下类似的 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);
但这不能正常工作。我不确定如何传递多个参数,也就是说,我不确定这是否是正确的方法。是吗?
Node 会考虑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)
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
比占位更具体:mid
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句