Я работаю над приложением 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 ('/', маршруты); объявляется, передавая файл index.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 ('/ enroll (/ *)?', EnrollRouter); ) содержит компоненты get и post через файл 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;
Здесь все становится интереснее.Я использую почтальон, чтобы отправить запрос на "/ 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 должен вызвать postEnrollment, определенный в ../controllers/enrollPostController, потому что маршрут соответствует «/ 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!");
},
};