如何在 Express 中使用参数模块化删除路由
How to modularize a delete route with params in Express
我正试图在我的 Express.js 应用程序中点击删除路由,但由于某种原因无法正常工作。
我在侦听器中设置路由器文件和请求参数的方式存在一些问题。
我已经尝试了各种变体,但看不出我做错了什么。谢谢指点!
客户端请求中的url为:
删除:“localhost:8080/api/tasks/1”
路由模块的结构是这样的:
- 捕获 app.js 文件中所有以“/api”开头的 url 并将它们发送到 routes/index.js
- 在routes/index中,将所有以“api/tasks”开头的url发送到routes/tasks.js
- in routes/task.js 发送所有具有删除动词的请求 /routes/tasks/delete.js
在routes/tasks/delete.js中,有一条路线:
router.delete("/:id, async (req, res, next)=>{
ISSUE -----> this route never gets hit
})
更多详情:
路由文件是这样的:
/app.js
app.use("/api", require("./routes/index.js"));
/routes/index.js
const express = require("express");
const router = express.Router();
module.exports = router;
/**
* @route /api/tasks
* @verb get
*/
router.use("/tasks", require("./tasks"));
/routes/tasks/index.js
const express = require("express");
const router = express.Router();
module.exports = router;
/**
* @route /api/tasks
* @verb post
*/
router.post("/", require("./create"));
/**
* @route /api/tasks
* @verb get
*/
router.get("/", require("./read"));
/**
* @route /api/tasks
* @verb put
*/
router.put("/", require("./update"));
/**
* @route /api/tasks
* @verb delete
*/
router.delete("/", require("./delete"));
/routes/tasks/delete.js
const express = require("express");
const router = express.Router();
const db = require("../../models/db");
const { User, Task } = db.models;
module.exports = router;
router.delete("/:id", async (req, res, next) => {
let { id } = req.params;
// ISSUE: THIS ROUTE DOES NOT GET HIT
console.log("hit delete route");
try {
res.json({ test, "hit the delete route", id });
} catch (error) {
next(error);
}
});
/**
你有两个冲突
app.use(...)
用于加载导出的路由器
您加载单个路由的方式不正确,它们不会加载导出的路由,而是接收一个函数(在许多框架中也称为“控制器”)
// file 1 ./deleteController.js
const deleteController = (req, res, next) => {
// ...
}
module.exports = deleteController
// file 2 ./deleteRoutes.js
const express = require('express')
const router = express.Router()
const deleteController = require('./deleteController')
router.delete('/:id', deleteController)
module.exports = router
// file 3 ./index.js
// ...
app.use("/someNamespace", require("./deleteRoutes"))
// ...
我正试图在我的 Express.js 应用程序中点击删除路由,但由于某种原因无法正常工作。
我在侦听器中设置路由器文件和请求参数的方式存在一些问题。
我已经尝试了各种变体,但看不出我做错了什么。谢谢指点!
客户端请求中的url为:
删除:“localhost:8080/api/tasks/1”
路由模块的结构是这样的:
- 捕获 app.js 文件中所有以“/api”开头的 url 并将它们发送到 routes/index.js
- 在routes/index中,将所有以“api/tasks”开头的url发送到routes/tasks.js
- in routes/task.js 发送所有具有删除动词的请求 /routes/tasks/delete.js
在routes/tasks/delete.js中,有一条路线:
router.delete("/:id, async (req, res, next)=>{
ISSUE -----> this route never gets hit
})
更多详情: 路由文件是这样的:
/app.js
app.use("/api", require("./routes/index.js"));
/routes/index.js
const express = require("express");
const router = express.Router();
module.exports = router;
/**
* @route /api/tasks
* @verb get
*/
router.use("/tasks", require("./tasks"));
/routes/tasks/index.js
const express = require("express");
const router = express.Router();
module.exports = router;
/**
* @route /api/tasks
* @verb post
*/
router.post("/", require("./create"));
/**
* @route /api/tasks
* @verb get
*/
router.get("/", require("./read"));
/**
* @route /api/tasks
* @verb put
*/
router.put("/", require("./update"));
/**
* @route /api/tasks
* @verb delete
*/
router.delete("/", require("./delete"));
/routes/tasks/delete.js
const express = require("express");
const router = express.Router();
const db = require("../../models/db");
const { User, Task } = db.models;
module.exports = router;
router.delete("/:id", async (req, res, next) => {
let { id } = req.params;
// ISSUE: THIS ROUTE DOES NOT GET HIT
console.log("hit delete route");
try {
res.json({ test, "hit the delete route", id });
} catch (error) {
next(error);
}
});
/**
你有两个冲突
app.use(...)
用于加载导出的路由器您加载单个路由的方式不正确,它们不会加载导出的路由,而是接收一个函数(在许多框架中也称为“控制器”)
// file 1 ./deleteController.js
const deleteController = (req, res, next) => {
// ...
}
module.exports = deleteController
// file 2 ./deleteRoutes.js
const express = require('express')
const router = express.Router()
const deleteController = require('./deleteController')
router.delete('/:id', deleteController)
module.exports = router
// file 3 ./index.js
// ...
app.use("/someNamespace", require("./deleteRoutes"))
// ...