Express.js Маршрутизация не имеет смысла - PullRequest
1 голос
/ 27 сентября 2019

Я работаю над приложением 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!");
  },
};

Ответы [ 3 ]

0 голосов
/ 28 сентября 2019

Если вы следуете некоторому шаблону и меняются только конечные точки, например

http://localhost:4000/mycode/testUrl/abc
http://localhost:4000/mycode/testUrl/Pqr/xyz
http://localhost:4000/mycode/testUrl/abc/xyz/pqs
const service = express.Router();
// **console** is just to check your endUrl. you can print originalUrl as well
service.get('/*', function(req, res) {console.log(req.url); }
service.post('/*', function(req, res) { console.log(req.url);} 

app.use('/mycode/testUrl', service);
0 голосов
/ 30 сентября 2019

В вашем index.js

Экспресс-маршрутизатор, определенный как

router.use('/enroll(/*)?', enrollRouter);

, передает '/ enroll / new' в enrollRouter.js

так что все, что вам нужно дать "/" в почтовом маршруте, так что "/ enroll / new" находится прямо перед ним, но из-за вложенности маршрутов мы можем их разделить.

Надеюсь, я ответил на вопрос.

0 голосов
/ 27 сентября 2019

Попробуйте выполнить следующее:

маршрутов / index.js

// Delegate "/enroll/*" to router
router.use('/enroll', enrollRouter);

маршрутов / enrollRouter.js

// Handle POST requests to "/enroll/new"
router.post('/new', postEnrollment);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...