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

use*_*720 13 routes views subdirectory node.js express

我正在尝试为localhost创建一个路由:port/admin /我想在匹配的文件夹中保留routes.js文件和view.js文件,所以我以后不会有太多的spaggeti

但我一直得到:500错误:无法查找视图"/ admin/manage_subjects"尝试创建一个新的路由和使用相同的文件夹几个相同

我有快递的以下视图文件夹

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)
Run Code Online (Sandbox Code Playgroud)

代码:routes/admin/index.js

exports.index = function (req, res) {
res.render('manage_subjects',{title:'Express'});}
Run Code Online (Sandbox Code Playgroud)

意见/管理/ manage_subjects.jade

extends admin_layout
block content
h1 = title
p Welcome to #{title}
Run Code Online (Sandbox Code Playgroud)

我的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'));
});
Run Code Online (Sandbox Code Playgroud)

Har*_*rdy 14

我一直在处理我认为是同样的问题,并想出如何解决它.所以如果有其他人遇到这个问题我会发布我的解决方案.

所以这就是我所拥有的导致404和500的东西

app.js

var routes = require('./routes/index');
var admin = require('./routes/admin');

app.use('/', routes);
app.use('/admin', admin);
Run Code Online (Sandbox Code Playgroud)

这是我的routes/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;
Run Code Online (Sandbox Code Playgroud)

和我的路线/ 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;
Run Code Online (Sandbox Code Playgroud)

通过在router.get()函数中定义第二个/ admin我认为我有效地告诉节点在我的views文件夹中查找以下路径视图/ admin/admin/index.ejs中的html.所以要修复我所要做的就是从router.get()或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
Run Code Online (Sandbox Code Playgroud)

这是我的routes/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;
Run Code Online (Sandbox Code Playgroud)

和我的路线/ 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;
Run Code Online (Sandbox Code Playgroud)

因此,进行此更改使得我可以在views文件夹中包含子文件夹.


Dav*_*vid 0

我会查看 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
Run Code Online (Sandbox Code Playgroud)

另一种选择类似于您的app.js文件中的内容:

var express require("express")
var app = express()
var routes = require("./path/to/routes")(app)
Run Code Online (Sandbox Code Playgroud)

然后路线将如下所示:

routes = function (app) {
  app.get("/route", middleWareifYou.gotIt, route.handler || function (req, res) {
    res.send("some msg");
  });
};

module.exports = routes
Run Code Online (Sandbox Code Playgroud)

干杯,我希望这有帮助!