如何修复路由以在 node.js 的子文件夹中查找视图
Posted
技术标签:
【中文标题】如何修复路由以在 node.js 的子文件夹中查找视图【英文标题】:how do i fix routes to find views inside subfolders in node.js 【发布时间】:2013-06-29 19:02:36 【问题描述】:我正在尝试为 localhost:port/admin/ 创建一个路由 我想将 routes.js 文件和 view.js 文件保存在匹配的文件夹中,这样我以后就不会有太多的意大利面了
但我不断收到:500 错误:无法查找视图“/admin/manage_subjects” 用于尝试创建新路线并使用相同的文件夹很少相同
我有以下带有 express 的视图文件夹
mainapp(root)
routes(folder)
admin(folder)
index.js(nested inside admin)
index.js(nested inside routes)
views(folder)
admin(folder)
admin_layout.jade(nested inside admin)
manage_subjects.jade(nested inside admin)
index.jade(nested inside views)
layout.jade(nested inside views)
代码: 路由/admin/index.js
exports.index = function (req, res)
res.render('manage_subjects',title:'Express');
views/admin/manage_subjects.jade
extends admin_layout
block content
h1 = title
p Welcome to #title
我的 app.js 代码
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, admin_routes = require('./routes/admin/')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, repository = new (require('./domain_model/repository'))();
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env'))
app.use(express.errorHandler());
//fill local subjects
repository.subjects.GetAll(function (err, data)
if (err) throw err;
app.locals.subjects = data;
);
//append routes
app.get('/', routes.index);
app.get('/admin', admin_routes.index);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function()
console.log('Express server listening on http://localhost:' + app.get('port'));
);
【问题讨论】:
在 routes/admin/index.js 中似乎应该是res.render('admin/manage_subjects',title:'Express');
我试过了,没用:(
【参考方案1】:
我会查看 TJ 关于模块化应用程序的视频 on his vimeo
关于此工作流程的最佳部分是您的代码变得非常灵活,并且更容易保持 DRY
。
另外,我会用我的app.set("views")
做类似的事情
var path = require("path");
app.set('views', path.join(__dirname, 'views'));
// you can then extend this to the example for routes
另一种选择是在您的app.js
文件中:
var express require("express")
var app = express()
var routes = require("./path/to/routes")(app)
然后路线看起来像:
routes = function (app)
app.get("/route", middleWareifYou.gotIt, route.handler || function (req, res)
res.send("some msg");
);
;
module.exports = routes
干杯,我希望这会有所帮助!
【讨论】:
【参考方案2】:我一直在处理我认为相同的问题,并想出了如何解决它。因此,如果其他人遇到此问题,我将发布我的解决方案。
这就是导致 404 和 500 的原因
app.js
var routes = require('./routes/index');
var admin = require('./routes/admin');
app.use('/', routes);
app.use('/admin', admin);
这是我的路线/index.js
//append routes
var express = require('express');
var router = express.Router();
router.get('/', function(req, res)
res.render('index', title: 'Express');
);
module.exports = router;
还有我的路线/admin.js:
var express = require('express');
var router = express.Router();
router.get('/admin', function(req, res)
res.render('admin/index', title: 'Express');
);
module.exports = router;
通过在 router.get() 函数中定义第二个 /admin,我认为我实际上是在告诉节点在以下路径 views/admin/admin/index.ejs 下的视图文件夹中查找 html。因此,要解决这个问题,我所要做的就是从 router.get() 中删除 /admin 或从 app.use() 中删除 /admin 所以我的工作代码现在看起来像这样:
app.js
var routes = require('./routes/index');
var admin = require('./routes/admin');
app.use('/', routes);
app.use('/admin', admin); //I left the /admin here and instead removed the one in routes/admin.js
这是我的路线/index.js
//append routes
var express = require('express');
var router = express.Router();
router.get('/', function(req, res)
res.render('index', title: 'Express');
);
module.exports = router;
还有我的路线/admin.js:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) //NOTICE THE CHANGE HERE
res.render('admin/index', title: 'Express');
);
module.exports = router;
因此进行了更改,以便我可以在我的视图文件夹中拥有子文件夹。
【讨论】:
res.render('admin/index', title: 'Express');我的解决方案 - 谢谢 谢谢!这是完美的。这应该是答案。 嗨,...我是 NodeJS 的新手...并且我已经安装了 nodejs 10。我可以获取您刚才在此处给出的上述示例的源代码吗?提前致谢。【参考方案3】:简单答案,用于视图文件夹中的子文件夹(我的称为前端)
click here the picture to see the folder structure
file app.js
app.set('views', [path.join(__dirname, 'frontend'), path.join(__dirname, 'frontend/locked'), path.join(__dirname, 'frontend/template'), path.join(__dirname, 'frontend/public')]);
app.set('view engine', 'pug')
【讨论】:
以上是关于如何修复路由以在 node.js 的子文件夹中查找视图的主要内容,如果未能解决你的问题,请参考以下文章
正确导出 node.js 中的类以在其他所需文件中扩展它们[重复]
Node.js MySql如何知道用户ID以在登录后的查询中使用它