node.js - 如何在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)
解决方案
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
。
推荐阅读
- sql - 尝试加入表时从子句条目错误中获取
- laravel - 条纹收银员,忽略客户迁移
- python - PyCharm 自动完成烧瓶模型实例化
- python - 烧瓶用户图像输入
- python - 在 Ubuntu 20.04 上安装 libmdbodbc1 库以使 MDBTools 与 Python 一起使用
- python - 如何计算 JSON 中的对象并检查这些对象中的错误语句
- android - React Native、Expo、Android。中止消息:“无法获得脏矩阵!”
- android-studio - 什么版本的 Android Studio 支持 gradle 插件版本 1.2.2?
- python - OpenCV 视频处理和链接组件
- r - 在 NumberLine 图表上标记特定位置