如何在 Express 中使用参数模块化删除路由

How to modularize a delete route with params in Express

我正试图在我的 Express.js 应用程序中点击删除路由,但由于某种原因无法正常工作。

我在侦听器中设置路由器文件和请求参数的方式存在一些问题。

我已经尝试了各种变体,但看不出我做错了什么。谢谢指点!

客户端请求中的url为:

删除:“localhost:8080/api/tasks/1”

路由模块的结构是这样的:

  1. 捕获 app.js 文件中所有以“/api”开头的 url 并将它们发送到 routes/index.js
  2. 在routes/index中,将所有以“api/tasks”开头的url发送到routes/tasks.js
  3. 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);

  }
});

/**

你有两个冲突

  1. app.use(...)用于加载导出的路由器

  2. 您加载单个路由的方式不正确,它们不会加载导出的路由,而是接收一个函数(在许多框架中也称为“控制器”)

// 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"))

// ...