2014-07-11 46 views
0

我有一個nodejs + express項目。我想掛載控制器和視圖,但我不知道如何。我如何安裝MVC nodejs + express

在我app.js我有var stats = require('./controllers/stats');app.use(stats);

我的文件夾控制器:stats/index.js,我的觀點:stats/index.jade.

,當我嘗試訪問localhost:1200/stats - >不能獲得/統計

是需要路線?

我用快遞 「3.2.6」

我app.js

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path'); 

var app = express(); 

//modulos 
**var stats = require('./controllers/stats');** 

// 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()); 
} 

app.get('/', routes.index); 
app.get('/users', user.list); 

//rutas 
**app.use(stats);** 

var server = app.listen(1200); 
console.log('Express server listening on port 1200'); 

在我的控制器

var express = require('express'); 
var app = module.exports = express(); 

app.set('views', __dirname + '/views'); 

app.get('/views/stats', function(request, response) { 

    response.render('index', { 
    title: 'Estamos en el controlador stats' 
    }); 

}); 

在我看來

extends layout 

block content 
    h1= title 
    p Welcome to #{title} 
    p esta es la vista del controlador Stats 
+0

是需要過程的路線。你已經寫了app.get('/ views/stats'),期望你的URL是'localhost/views/stats'。對於有MVC背景的人來說,使用express的node.js可能看起來很奇怪。用express實現MVC有點複雜。 – nightgaunt

+0

我是否需要創建文件夾路由和每個路由並在目錄路徑中創建一個條目? – davidcm86

回答

1

下面是完整的解。由於這是我很久以前遇到的一個有效問題,因此我給出了整個代碼。但是否理解它是給你的。

在app.js

var config = require('./config/config.js'); 
var express = require('express'); 
var app = express(); 
config.setConfig(app, express); 

if (config.requestMethod == 'HTTPS') { 
    var request = require('https'); 
    var options = [config.httpsOptions, app]; 
} else if(config.requestMethod == 'HTTP') { 
    var request = require('http'); 
    var options = [app]; 
} 

require('./config/db.js'); 

var server = request.createServer.apply(this, options).listen(app.get('port'), function() { 
    console.log("Server started"); 
}); 

require('./route/router')(app); 

在/config/config.js

var fs = require('fs'); 
module.exports = { 
    port: 8443, 
    mode: 'development', 
    requestMethod: 'HTTP', 
    httpsOptions: { 
     key: fs.readFileSync('/etc/apache2/ssl/server.key'), 
     cert: fs.readFileSync('/etc/apache2/ssl/server.crt'), 
     requestCert: false, 
     rejectUnauthorized: false 
    }, 
    setConfig: function(app, express) { 
     app.set('port', process.env.PORT || module.exports.port); 
     app.set('view engine', 'jade'); 
     app.use(express.favicon()); 
     //app.use(express.logger('dev')); 
     app.use(express.json()); 
     app.use(express.urlencoded()); 
     app.use(express.methodOverride()); 
     app.use(app.router); 
    } 
}; 

如果是HTTP而已,你可以刪除HTTPS相關的選項。

在/config/db.js

var mongo = require('mongoskin'); 

var MONGODB_HOST = "localhost"; 
var MONGODB_PORT = "27017"; 
var MONGODB_DATABSE = "dbname"; 
var MONGODB_USER_RW_NAME = "dbuser"; 
var MONGODB_USER_RW_PASS = "admin"; 

var db = mongo.db('mongodb://'+MONGODB_USER_RW_NAME+':'+MONGODB_USER_RW_PASS+'@'+MONGODB_HOST+':'+MONGODB_PORT+'/'+MONGODB_DATABSE, {safe: false}); 
var Tracking = require('../model/tracking.js'); 

GLOBAL.db = db; 
GLOBAL.HOST = 'localhost'; 
GLOBAL.HEADER_MATCH = /localhost/i; 
GLOBAL.ROOT_PATH = '/site/index.php/'; 
GLOBAL.Tracking = Tracking.construct(db); 

跟蹤是我寫了一個自定義模式。您將在稍後看到代碼。

在/route/router.js

router = function(app) { 
    var routes = { 
     'POST /test/link': 'testController.test' 
    }; 

    var loadedControllers = {}; 
    for(var i in routes) { 
     var requestMethod = i.split(' ')[0].toLowerCase(); 
     var routeURL = i.split(' ')[1]; 
     var controller = routes[i].split('.')[0]; 
     var method = routes[i].split('.')[1]; 
     if (loadedControllers[controller]) { 
      var loadControl = loadedControllers[controller]; 
     } else { 
      var loadControl = require('../controller/' + controller); 
      loadedControllers[controller] = loadControl; 
     } 
     app[requestMethod](routeURL, loadControl[method]); 
    } 
}; 
module.exports = router; 

,當你添加一個新的URL或API,你需要添加路由一個條目對象鏈接URL到控制器。

在/controller/testController.js,

exports.test = function(req, res) { 
    //Your code 
}; 

在/模型/跟蹤/ JS,

exports.construct = function(db) { 
    var _Tracking = function(data) { 
     this.info = { 
     _id: data && data._id || null, 
     value: data.value || 0 
    }; 

    _Tracking.test = function(id, cb) { 
     //your code involving db 
     cb(); //Send parameters to callback if necessary 
     //Call this function from controller directly using Tracking.test 
    }; 
    return _Tracking; 
}; 

就是這樣。您可以在此基礎上構建。

+0

太好了,謝謝! – davidcm86

1

首先,我需要在我的應用程序的根目錄中的三個文件夾。

車型

意見

控制器

現在到應用程序。JS

var express = require('express'); 
     ,http = require('http'); 
     ,path = require('path'); 
     ,app = express(); 
     ,fs = require('fs'); 

// database connection 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/mydb'); 

// some environment variables 
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(express.cookieParser('your secret here')); 
app.use(express.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

// dynamically include routes (Controller) 
fs.readdirSync('./controllers').forEach(function (file) { 
    if(file.substr(-3) == '.js') { 
     route = require('./controllers/' + file); 
     route.controller(app); 
    } 
}); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

這裏是我在控制器放置一個例子/ users.js

var mongoose = require('mongoose') 
var Video = require('../models/user'); 
module.exports.controller = function(app) { 

/** 
* a home page route 
*/ 
    app.get('/signup', function(req, res) { 
     // any logic goes here 
     res.render('users/signup') 
    }); 

/** 
* About page route 
*/ 
    app.get('/login', function(req, res) { 
     // any logic goes here 
     res.render('users/login') 
    }); 

} 

res.render( '用戶/註冊'),這導致在該視圖從視圖/用戶被裝載/ signup.jade在這個應用程序。

最後,以供參考,在這裏是在模型的模型/ user.js的可能是什麼樣子:

Var mongoose = require('mongoose') 
     ,Schema = mongoose.Schema 
     userSchema = new Schema({ 
      username: String, 
      password: String 
     }), 
User = mongoose.model('user', userSchema); 

module.exports = User;