2013-07-02 4 views
11

ich versuche, eine Route für localhost zu erstellen: port/admin/ und ich möchte die routes.js Dateien und view.js Dateien in übereinstimmenden Ordnern so habe ich gewohnt zu viele spaggeti späterWie behebe ich Routen zu finden Ansichten in Unterordnern in node.js

aber ich erhalte: 500 Fehler: Fehler im Hinblick auf Nachschlag „/ admin/manage_subjects“ für den Versuch, eine neue Route zu erstellen und mit gleichen Ordnern einige die gleichen

Ich habe die folgende Ansicht Ordner mit 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) 

Code: Routen/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} 

mein app.js Code

/** 
* 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')); 
}); 
+0

in routes/admin/index.js scheint es sollte es 'res.render ('admin/manage_subjects', {title: 'Express'});}' – knshn

+0

ich habe es versucht, hat nicht funktioniert :( – user2538720

Antwort

1

ich austesten würde TJ's Video über Modular Apps on his vimeo Das Beste an diesem Workflow ist, dass dein Code sehr flexibel wird und es viel einfacher ist, DRY zu bleiben.

Zusätzlich würde ich so etwas tun mit meinem app.set("views")

var path = require("path"); 
app.set('views', path.join(__dirname, 'views')); 

// you can then extend this to the example for routes 

Eine weitere Alternative etwas wie in Ihrer app.js Datei wäre:

var express require("express") 
var app = express() 
var routes = require("./path/to/routes")(app) 

und dann aussehen würde Routen wie:

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

module.exports = routes 

Prost, ich hoffe, das hilft !

12

Ich habe damit zu tun, was ich denke, ist das gleiche Problem und herausgefunden, wie es zu beheben. Falls jemand anderes auf dieses Problem stößt, posten wir meine Lösung.

Also hier ist, was ich hatte, dass verursache 404 ist und 500 des

app.js

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

app.use('/', routes); 
app.use('/admin', admin); 

und hier war meine Routen/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; 

und meine Routen/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; 

indem ich das zweite/admin innerhalb der router.get() Funktion definiere, denke ich, dass ich dem Knoten effektiv befohlen habe, nach dem HTML in meinem views Ordner unter den folgenden Pfadansichten zu suchen:/admin/admin/index.ejs. Um das zu beheben, musste ich nur den/admin aus dem router.get() oder dem/admin aus der app.use() entfernen. So sieht mein Arbeitscode jetzt so aus:

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 

und hier war meine Routen/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; 

und meine Routen/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; 

Also diese Änderung zu machen machte es so konnte ich sub Ordner in meinem Sichtenordner.

+0

res. render ('admin/index', {title: 'Express'}); Lösung für mich - thnks – Guihgo