Как я могу исправить маршруты для поиска представлений внутри подпапок в 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
Привет, надеюсь, это поможет!