为什么这条路线在任何地方都没有定义的情况下都能在express中工作



我刚开始表达,在学习一些教程时遇到了一个问题。问题是为什么这个URLhttp://localhost:8000/user/profile正在工作?我还没有为/user/profile定义任何路由。如果可能的话,请对此进行深入解释。这个中间件是如何工作的?router.use("/user", require("./users"));

这是主文件(index.js(


const express = require("express");
const path = require("path");
const port = 8000;
const app = express();
app.use("/", require("./routes/index"));
app.listen(port, function(err) {
console.log("Server started sucessfully at port", port);   
});

这是路由文件在不同的文件夹(index.js(


const express = require("express");
const router = express.Router();
router.use("/user", require("./users"));
router.get("/", function(req, res) {
return res.end("<h1>Express is ready</h1>")
});
module.exports = router;

这是用户文件(user.js(


const express = require("express");
const router = express.Router();
router.get("/profile", function(req, res) {
res.end("<h1>User Controller</h1>");
});
module.exports = router;

在主文件中,您定义了这个

app.use("/", require("./routes/index"));

这意味着express将使用或'/'附带的任何请求-将重定向到路由/索引页面上定义的路由

router.use("/user", require("./users"));

类似地,在您的路由文件中,您定义了/user,因此任何像/user、/user/xyz、/user/25(GET、Post、put、delete(这样的请求都将被处理/重定向到此用户路由。

最后在您的用户文件中-(所有/用户请求都会到此(

router.get("/profile", function(req, res) {
res.end("<h1>User Controller</h1>");
});

您已经编写了处理/配置文件页面的逻辑。

因此,如果你链接所有的步骤-它将来自根-> / -> /user -> /profile

好的,让我们从上到下。在你的主要index.js文件中,你有这行

app.use("/", require("./routes/index"));它的作用是,每个到达/端点的请求都由./routes/index文件处理,该文件是作为中间件提供的

现在,在路由索引文件中,您具有与/user端点类似的功能router.use("/user", require("./users"));。现在,每个到达/user的请求都由user.js文件处理,在那里你就有了

router.get("/profile", function(req, res) {
res.end("<h1>User Controller</h1>");
});

所以现在您的端点变成/user/profile

在前面所说的基础上,当app.use()将传入请求的url与它所安装的路径匹配时,它实际上会通过删除匹配的路径部分来重写url。

您可以通过以下程序看到这一点:

var express = require('express')
var app = express()
app.use("/test", (req, _, next) => {
console.log("original url path: " + req.originalUrl)
console.log("current url path: " + req.url)
next()
})
app.use("*", (_, res) => res.sendStatus(204))
app.listen(3000, () => console.log("Server listening."))
// console output when navigating to http://localhost:3000/test/whatever
original url path: /test/whatever
current url path:  /whatever       // the /test prefix was removed here.

如果将Router实例作为第二个参数传递给app.use(),则路由器将尝试根据当前重写的url为自己的路由查找匹配项。

最新更新