我刚开始表达,在学习一些教程时遇到了一个问题。问题是为什么这个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为自己的路由查找匹配项。