自己写NodeJs开发规范

开发规范

  • 命名规范
  • 注释规范
  • 方法定义以及,exports规范
  • 测试规范(待完善)
  • GIT管理规范
命名规范
>1. 变量命名,首字母小写,其余首字母大写方式,如:userAddress, articleTitle 等等
>2. 方法命名,同变量命名,如:sayHello(), printLog() 等等
>3. 类命名, 所有单词首字符大写,如 User, UserPermission
>4. 常量命名, 所有单词大写,以下化线分割, 如 APP_ID, APP_SECRET等等
>5. 适用以上所有,命名应该尽量通俗易懂,如 getUserByUsername,getUserById 要好于getUserByCondition(),更多详情可以参考 [《代码整洁之道》](http://item.jd.com/10064006.html)
注释规范
>1. 方法注释,如根据用户名密码验证用户: 
/**
 * 验证用户合法性(方法作用)
 *
 *@param {String} username 用户名 (参数注释)
 *@param {String} password 密码(参数注释)
 *@param {function} callback
 * - err
 * - User
 **/
var authenticate = function(username, password, callback){
    User.findOne({username:username,password:password}, callback);
}
>2. 类注释
/**
 * 分页控件类
 *
 *@param {Number} page 当前页
 *@param {Number} perPage 每页记录数
 *@param {Number} total 总页数
 *@param {Array} items 记录条目(如查询第一页图书,items为第一页图书所有记录)
 **/
function Paginate(page, perPage, total, items){
    this.page = page;
    this.perPage = perPage;
    this.total = total;
    this.items = items;
}
>3. 普通变量注释,一般通俗易懂变量无需注释,如username, password,或者通俗英语单词travelRoute,缩写单词需要注释,但是应该尽量避免使用缩写单词
//用户具有的money
var userOwnMoney = 1000;
>4. 类变量注释: 
/**
 * 分页控件类
 *
 *@param {Number} page 当前页
 *@param {Number} perPage 每页记录数
 *@param {Number} total 总页数
 *@param {Array} items 记录条目(如查询第一页图书,items为第一页图书所有记录)
 **/
function Paginate(page, perPage, total, items){
    this.page = page;
    //下一页
    this.nextPage = this.page + 1;
}
方法定义以及,exports规范
>1. proxy, controller, middleware 中的方法采用var定义, 所有exports放在文件最后,方便代码复用,如验证用户是否登录中间件,以及验证是否登录并且用户账号类型是销售的中间件定义[代码地址](http://gitlab.tulingdao.com/top/tree/development/modules/auth/routes/middleware/index.js):
/**
 * 验证是否登陆
 *
 * @param req
 * @param res
 * @param next
 */
var requireLogin = function(req, res, next){
    var user = req.session.user;
    if(!user){
        if(req.xhr){
            res.jsonp({errcode:-99, errmsg:'您还没有登录或者已经超时'});
        }else{
            req.session.error = '您还没有登录或者已经超时';
            res.redirect('/auth/login?next='+req.originalUrl);
        }
    }else{
        next();
    }
}

/**
 * 验证是否登陆并且账号类型是旅行社
 *
 * @param req
 * @param res
 * @param next
 */
var requireLoginAndTravelOrgAccount = function(req, res, next){
    var user = req.session.user;
    requireLogin(req, res, function(){   //此处复用了requireLogin中间件
        if(User.isAccess(User.TRAVEL_ORG_ACCOUNT_TYPE, user.accountType)){
            next();
        }else{
            req.session.error = '您不具备旅行社账号权限';
            req.redirect('/');
        }
    })
}
测试规范(待完善)
>1. 所有方法需要书写单元测试
>2. 测试使用mocha框架,详情见[http://visionmedia.github.io/mocha/#installation]
>3. 测试路径与源代码采用相同路径,如 源代码下 controllers/user ,测试代码下是 test/controllers/user, 具体如下: 
    top
       -modules
            - auth
                - controllers
                - models
                - proxy
            - 其他模块
        - test
            - auth
                - controllers
                - models
                - ...
            - test.js在test.js中require所有测试文件
>4. 测试举例如下:
/**
 * Created by hp-wanglihui on 2014/6/2.
 */

'use strict';

var User = require('../../models').User;
var UserProxy = require('../../proxy').UserProxy;
var assert = require('assert');

//测试UserProxy
describe('UserProxy', function(){
    //测试newAndSave方法
    describe('#newAndSave',function(){
        it('it should add success and callback(null, User instance)', function(){
            var username = Date.now()+'';
            var email = username+'@test.com';
            var password = '123456';
            var user = new User({email:email, username:username, password:password});
            UserProxy.newAndSave(user, function(err, user){
                assert.equel(null, err);
                assert.equal(true, user instanceof User);
            })
        })
    })
})

你可能感兴趣的:(nodejs)