我正在尝试学习expressjs,并且一直试图想出一种方法来将MVC结构添加到其中。出于某种原因,当我尝试访问localhost:3000时出现404错误。
我的目录结构是:
App.js:
mymodule = {
/* initialize
* ==============================
* load dependencies & external node modules, setup engines */
initialize: function() {
// load modules
this.express = require('express');
this.path = require('path');
this.favicon = require('static-favicon');
this.logger = require('morgan');
this.cookieParser = require('cookie-parser');
this.bodyParser = require('body-parser');
// initialize main express app.
this.app = this.express();
// attach view engine to app
this.app.set('views', this.path.join(__dirname, 'views')); // view files are in /views/
this.app.set('view engine', 'jade');
// attach modules to app
this.app.use(this.favicon());
this.app.use(this.logger('dev'));
this.app.use(this.bodyParser.json());
this.app.use(this.bodyParser.urlencoded());
this.app.use(this.cookieParser());
this.app.use(this.express.static(this.path.join(__dirname, 'public'))); // static files are in /public/
},
/* setErrorHandlers
* ===============================
* set error handlers for routing */
setErrorHandlers: function() {
if (this.app == undefined) {
console.log("caught an attempt to set error handlers without initializing");
} else {
// Catch 404 Error and forward to error handler
this.app.use(function(req, res, next) {
console.log("Caught 404 Error");
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// Error Handlers
// 1) Dev Error Handler. print stack trace
if (this.app.get('env') === 'development') {
this.app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// 2) Production Error Handler
this.app.use(function(err, req,res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
}
},
/* setRouters
* ================================
* */
setRouters: function() {
// get all routes
this.routes = require('./routes').construct(this.app);
}
}
mymodule.initialize();
mymodule.setErrorHandlers();
mymodule.setRouters();
module.exports = mymodule.app;'
routes.js:
var index_controller = require('./controllers/index').controller();
module.exports.construct = function(app) {
console.log("got here");
//app.get('/', require('./controllers/index').about);
//app.get('/', index_controller.index);
app.get('/', function(req,res) {res.send("sdf");});
}
./控制器/ index.js:
module.exports.controller = function() {
index_action = function(req, res) {
if (req == undefined) {
console.log("req undefined!");
} else {
console.log(req);
res.render('index', {title: 'Express'});
}
}
return {index: index_action};
}
我把代码放在github repo上: https://github.com/sjang92/expressjs-mvc/blob/master/controllers/index.js
有谁知道它为什么会发生?
谢谢
答案 0 :(得分:2)
您正在添加一个正常的中间件函数,在您的app.get('/', ..);
处理程序有机会执行之前响应请求:
this.app.use(function(req, res, next) {
console.log("Caught 404 Error");
var err = new Error('Not Found');
err.status = 404;
next(err);
});
您应该只在所有其他路线之后添加此类中间件。例如:
mymodule.initialize();
mymodule.setRouters();
mymodule.setErrorHandlers();