我如何修复path,以查找node.js中子文件夹内的视图

我想创build一个本地主机的路由:端口/pipe理/和我想保持routes.js文件和view.js文件在匹配的文件夹,所以我不会有太多spaggeti以后

但我一直得到:500错误:无法查找视图“/pipe理/ manage_subjects”试图创build一个新的路线和使用相同的文件夹几乎一样

我有快递以下查看文件夹

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) 

代码:routes / admin / index.js

 exports.index = function (req, res) { res.render('manage_subjects',{title:'Express'});} 

意见/pipe理/ 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')); }); 

我一直在处理我认为是同样的问题,并找出如何解决这个问题。 所以如果有其他人遇到这个问题,我张贴我的解决scheme。

所以这就是我所造成的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,我想我是有效地告诉节点在我的视图文件夹下面的path视图/ admin / admin / index.ejs中查找html。 所以要解决所有我必须做的是从router.get()或从app.use()/ admin删除/ 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; 

所以做了这样的改变,所以我可以有我的视图文件夹中的子文件夹。

我会看看他的video模块化应用程序on his vimeo TJ的video关于这个工作stream程的最好的部分是你的代码变得非常灵活,很容易保持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 

另一种select就像在你的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 

干杯,我希望这有助于!