Node.js控制器

我目前对Node.js – Express框架非常新,我试图模仿MVC模式,到目前为止我得到了这一点

app.js

var express = require('express'); var path = require('path'); var favicon = require('static-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var http = require('http'); var app = module.exports = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.set('port', process.env.PORT || 3000); app.use(favicon()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); require('./routes'); /// catch 404 and forwarding to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); /// error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); http.createServer(app).listen(app.get('port'), function() { console.log("Running server"); }); 

只是一个正常的app.js生成与快递发生器有一些修改,现在我的路线/ index.js

 app = require('../app'); app.get('/test', function(req, res) { require('./controllers/test.js'); test(); }); app.get('/', function(req, res) { res.send('yankevf'); }); 

正如你可以看到路线/testing如果寻找模块/controllers/test.js但由于没有实际的模块它不会工作..

如何包含文件夹控制器内的文件? 因为我的服务器在node_modules里面继续search

看起来你基本上在那里…

从你的问题,这听起来像你的文件夹结构是:

 ./app.js ./routes -> index.js ./controllers -> test.js 

如果是这样,这应该工作:

 app = require('../app'); app.get('/test', function(req, res, next) { test = require('../controllers/test.js'); // Note the path, one directory up // Passing the req, res, next arguments on to your controller allows it to respond // ie res.json({msg: 'hello world'}). test(req, res, next); }); 

尽pipe您可能不希望在每个新的请求中加载控制器,而只是加载(需要)一次,并在每个请求中调用它:

 app = require('../app'); testController = require('../controllers/test.js'); app.get('/test', function(req, res, next) { // Passing the req, res, next arguments on to your controller allows it to respond // ie res.json({msg: 'hello world'}). testController(req, res, next); }); 

如果你直接将这些parameter passing给你的控制器(就像你应该这样做),你可以更简洁地写下来:

 app = require('../app'); testController = require('../controllers/test.js'); // Call your controller, automatically passing 'req', 'res', 'next' arguments. app.get('/test', testController); 

有关自动安装路由的完整示例,请参阅: Express MVC示例