Как я могу исправить маршруты для поиска представлений внутри подпапок в node.js

Я пытаюсь создать маршрут для localhost: port/admin/ и я хочу сохранить файлы routes.js и файлы view.js в соответствующих папках, поэтому у меня не будет слишком много спаггетов позже

но я продолжаю получать: 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)

код: маршруты/администратора/index.js

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

вид/админ/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'));
});

Ответ 1

Я занимаюсь тем, что, по моему мнению, является той же проблемой, и выяснил, как это исправить. Поэтому, если кто-то сталкивается с этой проблемой, я отправляю свое решение.

Итак, вот что я имел, что вызывало 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;

определяя второй /admin внутри функции router.get(), я думаю, что я эффективно говорил node искать html в моей папке представлений при следующих представлениях пути /admin/admin/index.ejs. Поэтому, чтобы исправить все, что мне нужно было сделать, это удалить /admin из router.get() или /admin из app.use() Поэтому мой рабочий код теперь выглядит следующим образом:

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;

Таким образом, внесение изменений привело к тому, что у меня могли быть подпапки в моей папке представлений.

Ответ 2

Я бы посмотрел 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

Привет, надеюсь, это поможет!