• 用 Express 4.x 搭建项目 —— 后台架构


    Koa 作为下一代 Node.js Web 框架,而且由 express 团队原班人马打造,相信会比 express 做得更好。然而我还没用上 Koa,,,所以只能来说下 express 了。算是一篇笔记吧,记录做项目时学到的东西。

    项目的环境是:node v4.1.2 , express 4.x

    前期工作:装好各种环境

    项目大体架构:

    因为开始做之前是设想着前后端分离,前后端只用ajax进行数据交互,所以就后台结构就全写成api形式。前端页面的路由由angular 1.x来实现。

    express 配置 express.js

    /**
     * Created by hwen on 15/12/12.
     */
    
    'use strict';
    
    var express = require('express');
    var favicon = require('serve-favicon');
    var bodyParser = require('body-parser');
    var cookieParser = require('cookie-parser');
    var path = require('path');
    var session = require('express-session');
    var sessionStore = require('sessionstore');
    var uuid = require('uuid');
    var config = require('./environment');
    var morgan = require('morgan');
    var busboy = require('connect-busboy');
    
    module.exports = function(app) {
        console.log("root is:"+config.root);
        app.set('views', path.join(config.root , 'public/src'));
        // app.engine('html', require('ejs').renderFile);
        app.set('view engine', 'html');
        //app.use(compression());
    
    
        //解析http请求体(req.body)
        app.use(bodyParser.urlencoded({
            limit: '5000mb',
            extended: true
        }));
        app.use(bodyParser.json({
            limit:'5000mb'
        }));
    
        //配置 session
        app.use(session({
            genid: function(req) {
                return uuid.v1();
            },
            cookie:{maxAge: 900000},
            secret: 'i-waka',
            rolling:true,
            resave: true,
            saveUninitialized: true
        }));    
    
        app.use(cookieParser());
        //app.use(busboy({ immediate: true }));  设置 immediate 会导致图片保存不完整
        app.use(busboy());
    
        // config environment
        app.use(favicon(config.root + '/public/src/assets/images/favicon.ico'));
    
        app.use(express.static(path.join(config.root, 'public/src')));   //控制静态资源加载根目录
        app.set('appPath', config.root + 'public/src');
        app.use(morgan('dev'));
    };
    

      

    routes.js

    /**
     * Created by hwen on 15/12/12.
     */
    
    /*
    * Main application routes
     * */
    
    'use strict';
    
    var erros = require('./components/errors');
    
    module.exports = function(app) {
    
        // insert routes below
        app.use('/api/user', require('./api/user'));
        app.use('/api/question', require('./api/question'));
        app.use('/api/answer', require('./api/answer'));
        app.use('/api/topic', require('./api/topic'));
        app.use('/api/reply', require('./api/reply'));
        app.use('/api/message', require('./api/message'));
        app.use('/api/attitude', require('./api/attitude'));
    
        // All undefined asset or api routes should return a 404
        app.route('/:url(api|components|app|config)/*').get(erros[404]);
    
        // all other routes should redirect to the index.jade
        app.route('/*')
            .get(function(req, res) {
                res.sendfile(app.get('appPath')+'/index.html');
            })
    };
    

      

    app.js

    /**
     * Created by hwen on 15/12/19.
     */
    
    'use strict';
    
    var express =require('express');
    var mongoose = require('mongoose');
    var config = require('./config/environment');
    
    
    //Connect to database
    var uri = 'mongodb://localhost:27017/test';
    mongoose.connect(uri, config.mongo.options);
    
    //set up server
    var app = express();
    var server = require('http').createServer(app);
    require('./config/express')(app);
    require('./routes')(app);
    
    //start server
    server.listen(config.port, function() {
        console.log('Express server listening on %d', config.port);
        console.log(config);
    });
    
    // Expose app
    exports = module.exports = app;
    

      

    以 user api 为例,

    app.use('/api/user', require('./api/user'));

    相应的中间件写在 /user/index.js

    /**
     * Created by hwen on 15/12/12.
     */
    'use strict';
    
    var express = require('express'),
        controller = require('./user.controller');
    
    var router = express.Router();
    
    router.post('/login', controller.login);
    router.post("/", controller.create);
    router.post("/imgUpload", controller.imgUpload);
    router.post("/update", controller.update);
    router.post("/password", controller.updatePassword);
    router.get('/logout', controller.logout);
    router.get('/currentUser', controller.currentUser);
    router.get("/hello", controller.hello);
    router.get("/followingTopic/:_id", controller.getFollowingTopic);
    router.get("/followingTopicAll/:_id", controller.getFollowingTopicAll);
    router.get("/:id", controller.get);
    
    module.exports = router;
    

      

    而 /user/*.controller.js 跟 /user/*.model.js 就分别实现 controller 层以及 model 层的功能。

    至此一个大概的后台架构已经算是搭建完成了~

  • 相关阅读:
    概率与数学期望初步
    $Luogu$ $P4316$ 绿豆蛙的归宿(附期望 $dp$ 的设计总结)
    $Luogu$ $P4427$ $[BJOI2018]$ 求和
    $SP3978$ $DISQUERY$ $-$ $Distance$ $Query$
    最近公共祖先模板(未完待续)
    $Luogu$ $P3052$ $[USACO12MAR]$ 摩天大楼里的奶牛 $Cows$ $in$ $a$ $Skyscraper$
    $Luogu$ $P2622$ 关灯问题 $mathrm{II}$
    [转载] $CF633F$ 题解
    [转载] $Luogu$ $P3933$ 题解
    2020高考回忆录(随便写写
  • 原文地址:https://www.cnblogs.com/hwencc/p/5307162.html
Copyright © 2020-2023  润新知