繁体   English   中英

我如何挂载MVC Node.js + Express

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM