node.js(五)项目创建管理

项目的创建组织管理

项目的初始化、文件结构和模块管理

项目的文件结构

  • MVC模式
    • M:model
    • V:version
    • C:control
  • 前后端代码分离

文件结构

  • 水平文件结构
  • 垂直文件结构
    • 按功能结构

项目的初始化

模块化

高内聚低耦合

遵照MVC模式

使用moudle.exports

//xxx.js
module.exports={
    sum:function(){
        var result-0;
        for(var i in arguments[i])
        if(!isNaN(arguments[i]))
        result+=parseFloat(arguments[i])
    }
    return result;
}

在另一个文件中

var clac =require('./xxx.js')
calc.sum(32,321,3231)

后端项目的实践

npm初始化

npm init

系统名

系统版本

系统描述

入口文件 bin/www

xx

xx

密码

作者

yes

创立文件夹结构

需要安装express和bodyParser

需要放置在package.json作为依赖项

  • bin(入口文件夹)
    • www(无后缀名)
  • app(后端文件夹)
  • module_exports(模块文件夹)
  • config
    • config.js
    • app.js
    • package.js
    • env(配置文件夹)
      • development.js
      • express.js
//developments.js
//端口号文件
moudle.exports={
    port:7101
}
//config.js
var config=null;
//process全局变量查询
if(process && process.env(楼上的文件夹名) && pocess.env.NODE_ENV(自己随便设置,创造的变量){
config=require('./env/'+pricess.env.NODE_ENV+'./js')
}else{
    config=require('./env/develoment.js')
}
module.exports=config

//express.js
var express=require('express');
var bodyParser=require('body-parser');//使用中间件

module.exports=function(){
    console.log('init express');
    var app=express();

    app.use(bodyParser.json())//解析post值的数据,使用中间件

    //请求了不存在资源,返回404
    app.use(function(req,res,next){
        res.status(404);
        try{
            return res.json('not Found');
        }catch(e){
            console.error('404 set header afeter sent');
        }
    })

    //错误
    app.use(function(err,req,res,next){
        if(!err){return next()}
        res.status(500);
                try{
                    return res.json(err.message||'sever error');
        }catch(e){
            console.error('500 set header afeter sent');
        }  
    })
    return app;
}

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

var app=express();

module.exports=app;

//www 入口文件
//设置解释执行器 设置node执行
#!/usr/bin/env node(路径名)

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

app.listen(config.port,function(){
    console.log('server is running');
})

简单的CMS

实现简单的CMS系统的后端API

  • bin(入口文件夹)
    • www(无后缀名)
  • app(后端文件夹)
    • controllers(文件夹)
      • news.sever.controllers.js
    • models
      • news.sever.model.js(新闻相关后端的模型)
    • routes
      • news.sever.routes.js
  • module_exports(模块文件夹)
  • config
    • config.js
    • app.js
    • package.js
    • env(配置文件夹)
      • development.js
      • express.js
      • mongoose.js
//news.server.model.js
var mongoose=require('mongoose');

var NewSchema=new mongoose.Schema({
    title:String,
    content:String,
    createTime:{type:Date,defult:Date.now}
});

var News=mongoose.model('News',NewSchema);
//developments.js
//端口号文件
moudle.exports={
    port:7101,
    mongodb:'mongodb://localhost/数据库名'
}
//mongoose.js
var mongoose=require('mongoose');
var config=require('./config');

module.exports=function(){
    var db=mongoose.connect(config.mongodb);

    require('../app/models/news.sever.model')

    return db;
};

//app.js
var express =require('./config/express');
var mongodb=require('./config/mongoose');

var db=mongodb();

var app=express();

module.exports=app;
//new.server.controller.js
var mongoose=require('mongoose');

var News=mongoose.model('News');

module.exports={
    //创建新闻
    creat:function(req,res,next){
        var new =new News(req.body);
        news.save(function(err){
            if(err) return next(err);

            return res.json(news);
        })
    },
    //翻页
    list:function(req,res,next){
        var pagesize =parseInt(req.query.pagesize,10)||10//如果没有页数,就从第一页
        var pagestart=parseInt(req.query.pagestart,10)||1;
        //翻到指定页数
        News
        .find()
        .skip((pagestart-1)+pagesize)
        .limit(pagesize)
        .exec(function(err,docs){
            if(err) return next(err);

            return res.json(docs);
        });
    },
    getByid:function(req,res,next,id){
        if(!id) return next(new Error('News not Found'));

        News
        .findOne({_id:id})
        .exec(function(err,doc){
            if(err) return next(err);

            if(doc) return next(new Error('News not Found'));

            req.news=doc;

            return next();
        });
    },

    get:function(req,rex,next){
        return res.json(req.news);
    }
};

//news.sever.routes.js
var NewsController=require('../controllers/news.server.controller');

module.exports=function(app){
    app.route('./news')
        .get(Newscontrollers.list)
        .post(Newscontrollers.creat);
    
    app.route('./news/:nid'(页面详情))
        .get(Newscontrollers.get)

    app.param('nid',NewsController.getByid);
}

//express.js
var express=require('express');
var bodyParser=require('body-parser');//使用中间件

module.exports=function(){
    console.log('init express');
    var app=express();

    app.use(bodyParser.json())//解析post值的数据,使用中间件

    //导入路由
    require('../app/routes/news.server.routes')(app);
    
    //请求了不存在资源,返回404
    app.use(function(req,res,next){
        res.status(404);
        try{
            return res.json('not Found');
        }catch(e){
            console.error('404 set header afeter sent');
        }
    })

    //错误
    app.use(function(err,req,res,next){
        if(!err){return next()}
        res.status(500);
                try{
                    return res.json(err.message||'sever error');
        }catch(e){
            console.error('500 set header afeter sent');
        }  
    })
    return app;
}

猜你喜欢

转载自blog.csdn.net/InkBamboo920/article/details/97397104