javascript - Express.js 路由没有意义

标签 javascript node.js express

我正在开发 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/

相关文章:

node.js - pm2进程管理器不工作

node.js - 从 ReactJS 外部渲染组件

node.js - 创建一个中间件函数来检查用户角色是否等于 'Admin'

node.js - 返回模块的 nodejs 流输出以表达路由

node.js - passport.authenticate 中的 req 对象

javascript - 在 Fabric.js 中剪切区域并设置 Canvas 背景

javascript - 我可以在 IPAD 中运行 html/Javascript 文件吗

node.js - NodeJs cherrio 库解析 xml

javascript - iframe 出现问题

javascript - 不能将 child 附加到数组中的每个 DOM 元素?