Javascript express应用程序在即将到来的路线之前处理404。express.Router没有及时检测到所有存在的路由
以下是app.js文件:Javascript express应用程序在即将到来的路线之前处理404。express.Router没有及时检测到所有存在的路由,javascript,node.js,express,routing,routes,Javascript,Node.js,Express,Routing,Routes,以下是app.js文件: var express = require('express'); var routes = require('./routes/index'); app = express(); app.use('/', routes); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.stat
var express = require('express');
var routes = require('./routes/index');
app = express();
app.use('/', routes);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err); //res.render('404')
});
和routes/index.js:
var express = require('express')
, router = express.Router()
var importer = require('./../lib/importer')
, importRoutes = importer(__dirname)
, routes = {
views: importRoutes('./views')
};
router.get('/login', routes.views.login.get);
router.post('/login', routes.views.login.post);
router.get('/register', routes.views.register.get);
... and many other routes (more than 50)
router.get('/theLastRoute', routes.views.auth.oneOfTheLastRoutes.get);
module.exports = router;
但如果我转到localhost:3000/oneoflastroutes
或应用程序响应404底部的某个路由,即使该路由确实存在于routes/index.js中,并且如果我在模块中将该路由移到更高的位置,应用程序将给出正确的响应
我几乎可以肯定,问题出在lib/importer.js中,一些异步代码需要routes/views文件夹中的所有路由,而不是所有路由都分配给rotutes.view属性
importer.js:
var fs = require('fs');
var path = require('path');
function dispatchImporter (rel__dirname) {
function importer (from) {
//console.log('importing ', from);
var imported = {};
var joinPath = function () {
return '.' + path.sep + path.join.apply(path, arguments);
};
var fsPath = joinPath(path.relative(process.cwd(), rel__dirname), from);
fs.readdirSync(fsPath).forEach(function (name) {
var info = fs.statSync(path.join(fsPath, name));
//console.log(name);
if (info.isDirectory()) {
imported[name] = importer(joinPath(from, name));
} else {
// only import files that we can `require`
var ext = path.extname(name);
var base = path.basename(name, ext);
if (require.extensions[ext]) {
imported[base] = require(path.join(rel__dirname, from, name));
} else {
console.log('cannot require ', ext);
}
}
});
return imported;
}
return importer;
}
module.exports = dispatchImporter;
我没有想出一个解决方案,在404处理程序之前,所有路由文件都是必需的,并分配给routes
对象
文件结构如下:
app.js
lib/
importer.js
routes/
index.js
views/
login.js
register.js
etc...
问题出现在另一个模块中,在该模块中声明了重叠路由。确保您没有声明重叠路由(例如,在示例代码中,您有两个
GET/register
处理程序)。可能是一个意外的路由处理程序正在接收请求,不知道如何处理它。@robertklep这里我偶然写了第二个GET register
,我复制并粘贴了上一个路由以显示最后一个路由,但在更改处理程序名称时忘记更改/register
。现在我编辑了这篇文章。是的,没有任何重叠的路由。我在您的导入程序代码中没有看到任何异步代码,因此我认为这与此无关(如果是的话,您可能会在Express告诉您的路由处理程序无效时出错)。@robertklep是的,您是对的。问题出在其他模块中。谢谢你的帮助!