NodeJS Express 递归路由失败 (404)
nodejs express recursive routing fails (404)
我启动了一个新的节点项目,并希望动态添加路由。我以前做过,但从未比一级文件夹更深入。为此,我想出了一个递归函数来添加路由并遍历可能的子文件夹。该函数在我的应用程序中调用.js。项目文件夹如下所示:
app.js
routes/
index.js
users.js
api/
foo.js
test/
bar.js
函数在app.js中的定义和调用:
var express = require('express');
var fs = require('fs');
var path = require('path');
var app = express();
// Works
var routes = require('./routes/index');
app.use('/', routes);
// 404
getRoutes('routes');
function getRoutes(dir, cur) {
if(cur === undefined) {
cur = '/';
}
routes = fs.readdirSync(path.join(__dirname, dir));
routes.forEach( function (file) {
fs.stat(dir + "/" + file, function (err, stats) {
if (err) {
console.log(err);
}
else if (stats.isFile()) {
var routeFilePath = "./" + path.join(dir, file);
var route = path.join(cur, file.replace(/'.[^/.]+$/, ""))+'/';
if(file == 'index.js') {
route = cur;
}
console.log(route, "defined in:", routeFilePath);
var routeFile = require(routeFilePath);
app.use(route, routeFile);
}
else if (stats.isDirectory()) {
getRoutes(path.join(dir, file), path.join(cur, file));
}
});
});
}
请注意,直接调用app.use()
有效。有人看到错误吗?
console.log(route, "defined in:", routeFilePath);
的输出:
/ defined in: ./routes/index.js
/users/ defined in: ./routes/users.js
/api/foo/ defined in: ./routes/api/foo.js
/api/test/bar/ defined in: ./routes/api/test/bar.js
对我来说看起来是正确的。
问题是 fs.stats() 是异步的。路由必须同步定义,如下所示:
function getRoutes(dir, cur) {
if(cur === undefined) {
cur = '/';
}
routes = fs.readdirSync(path.join(__dirname, dir));
routes.forEach( function (file) {
var stats = fs.statSync(dir + "/" + file);
if (stats.isFile()) {
var routeFilePath = "./" + path.join(dir, file);
var route = path.join(cur, file.replace(/'.[^/.]+$/, ""))+'/';
if(file == 'index.js') {
route = cur;
}
console.log(route, "defined in:", routeFilePath);
var routeFile = require(routeFilePath.replace(/'.[^/.]+$/, ""));
console.log(routeFile);
app.use(route, routeFile);
}
else if (stats.isDirectory()) {
getRoutes(path.join(dir, file), path.join(cur, file));
}
});
}
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 未激发路由的控制器属性上的观察者
- AngularJS ui路由器html5模式中断路由
- 发送json对象或使用express路由呈现视图
- 使用主干网和rails的静态页面路由
- 如何使用Passport保护路由终结点
- 如何使失败的路由解析承诺加载不同的模板URL
- NodeJS Express 递归路由失败 (404)
- 对passportjs+Node.js+Express.js Rest API调用成功身份验证和失败的路由处理程序
- 处理路由时出现Ember错误:列出断言失败
- 由于某些原因,基于路由参数动态注入特定工厂会失败
- Nodejs / express - fresh install在尝试导航到路由时失败
- 在谷歌地图API 3中清除方向服务的路由失败
- 当' mapHooks '失败时重定向到另一个路由
- GET方法;位置”;node-js应用程序中的路由失败
- Google Maps v3 API获取路由持续时间失败