我正在开发 Express.js 应用程序,但我认为我无法理解多层路由的细微差别。我的应用在其 app.js 文件中包含以下代码段:
//app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
//new stuff
const routes = require('./routes');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
// middleware functions required
app.use(logger('dev')); //handles logging
app.use(express.json()); //JSON payload parser
app.use(express.urlencoded({ extended: false })); //urlencoded payload parser
app.use(cookieParser());
//content routes
app.use('/jquery', express.static(__dirname + '/node_modules/jquery/dist/'));
app.use('/', express.static(path.join(__dirname, 'public'))); //static files (css and other js files)
app.use('/', routes); //everything else (see /routes/index.js)
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
.
.
.
如代码中所示,在一堆静态文件和用于日志记录等的默认中间件设置之后,app.use('/', routes); 被声明,移交给索引/routes文件夹下的.js文件如下:
//index.js
//main router entry point, sets up all route modules
//instantiate the express.Router class
const express = require('express');
const router = express.Router();
//import our route modules
const indexRouter = require('./indexRouter');
const resetRouter = require('./resetRouter');
const enrollRouter = require('./enrollRouter');
//map individual route modules to their respective routes
router.use('/', indexRouter);
router.use('/reset', resetRouter);
router.use('/enroll(/*)?', enrollRouter);
module.exports = router;
三个 router.use 行调用同一目录中的各个路由文件,如图所示。前两个是简单的获取路由。第三个 (router.use('/enroll(/*)?', enrollRouter);) 通过 enrollRouter.js 文件具有获取和发布组件,如下所示:
//enrollRouter.js
const express = require('express');
const router = express.Router();
const { getEnroller } = require('../controllers/enrollGetController');
const { postEnrollment } = require('../controllers/enrollPostController');
router.post(/^(\/enroll\/new)/i, postEnrollment);
//router.post('/', postEnrollment);
router.get('/', getEnroller);
module.exports = router;
这里是事情变得有趣的地方。我正在使用 postman 向“/route/new”发出发布请求。如果上面代码中 post 路由的路由字符串设置为 '/',则一切正常,并且调用 enrollPostController.js 返回适当的内容。但是,如果我将路由字符串设置为 '/enroll/new' (我正在调用的路径......无论是字符串还是正则表达式),404 错误代码在 app.js 中被调用。
我没有关注正在发生的事情。我的印象是 router.get 或 router.post 调用开头的字符串表示要与定义为下一个参数的回调匹配的路径。当路径显然是指定的路径时,为什么我会收到 404?
我的想法是,当/enroll/new post 请求进来时,app.js 应该将所有匹配 '/' 的路由交给 index.js。然后 index.js 应该移交给 enrollRouter,因为路由匹配 '/enroll(/*)?'。最后,enrollRouter.js 应该调用 ../controllers/enrollPostController 中定义的 postEnrollment,因为路由匹配“/enroll/new”。但它不是那样工作的。
有人能指教吗?还是填补我理解中的漏洞?
这是 enrollPostController.js 中的代码
//enrollPostController.js
module.exports = {
postEnrollment(erq, res) {
//at this point we have the form submission data.
console.log(erq.body);
res.send("received form submission!");
},
};
最佳答案
尝试以下操作:
routes/index.js
// Delegate "/enroll/*" to router
router.use('/enroll', enrollRouter);
routes/enrollRouter.js
// Handle POST requests to "/enroll/new"
router.post('/new', postEnrollment);
希望对您有所帮助。
关于javascript - Express.js 路由没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58139134/