[英]How can I mount MVC nodejs + express
我有一个nodejs + express项目。 我想安装控制器并查看,但是我不知道如何。
在我的app.js中,我有var stats = require('./controllers/stats');
和app.use(stats);
我的文件夹控制器: stats/index.js
,我的视图: stats/index.jade.
当我尝试访问localhost:1200/stats
>无法获取/ 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
这是完整的解决方案。 由于这是我很久以前遇到的一个有效问题,因此我将为您提供整个代码。 但是,是否理解还是由您自己决定。
在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链接到控制器的route对象中添加一个条目。
在/controller/testController.js中,
exports.test = function(req, res) {
//Your code
};
在/ model / Tracking / 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;
};
而已。 您可以在此基础上构建。
首先,我在应用程序的根目录中需要三个文件夹。
楷模
意见
控制器
现在进入app.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'));
});
这是我放置在controllers / 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('users / signup')导致从此应用程序中的views / users / signup.jade加载视图。
最后,作为参考,这是models / user.js中的模型的外观:
Var mongoose = require('mongoose')
,Schema = mongoose.Schema
userSchema = new Schema( {
username: String,
password: String
}),
User = mongoose.model('user', userSchema);
module.exports = User;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.