在nodejs中以非事件驱动的方式编程是一个好主意吗?

时间:2016-02-11 15:26:12

标签: node.js mongoose event-driven-design

为了分离业务逻辑和数据访问层,我以非事件驱动的方式分离了文件和文件夹。以下是我采用的用户注册过程的示例,这是我的业务逻辑层文件。

var userDA = require('./../DataAccess/UserDA');
module.exports = {
  signUpUser: function(userGiven)
  {
    //Some bookeeping
    userGiven.userType = "admin";

    return userDA.save(tutorGiven);
   }
}

这是我的数据访问文件

"use strict";
var mongoose = require('mongoose');
if(!mongoose.connection)
    mongoose.connect('mongodb://localhost/test');
var User = require('./../models/User');

module.exports ={

    save : function(UserGiven){
    var pass = true;

    var user = new User(UserGiven);
    user.save(function (err) {
        if(err) {
            console.log(err);
            pass = false;
        }
    });
    return pass;
},

getUser: function (email) {
    var user = null;

    user.findOne({email:email},function(err,foundUser){
        if(err)
            console.log(err);
        else
            user = foundUser;
    });
    return user;

   }
}

这是一个中等大小的真实项目,作为nodejs的新手,我想知道并且需要专家建议,如果采用这种设计方法会有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您正遇到节点中异步编程新手的经典陷阱。例如,请考虑以下代码:

setTimeout(function () {
    console.log('timer');
}, 200);
console.log('done');

将输出以下内容:

done
timer

原因是setTimeout正在为以后调度异步工作。实际发生的是setTimeout函数立即返回,调用console.log('done'),然后~200 ms后调用回调函数并调用console.log('timer')

更合适的方法是使用回调来指示您的工作何时完成。像这样:

"use strict";
var mongoose = require('mongoose');
if(!mongoose.connection)
    mongoose.connect('mongodb://localhost/test');
var User = require('./../models/User');

module.exports ={

    save : function(UserGiven, callback){
        var pass = true;
        var user = new User(UserGiven);
        user.save(function (err) {
            if(err) {
                console.log(err);
                return callback(err);
            }
            return callback();
        });
    },

    getUser: function (email, callback) {

        user.findOne({email:email},function(err,foundUser){
            if(err) {
                console.log(err);
                return callback(err);
            }
            return callback(null, foundUser);
        });
    }
}

这遵循错误优先回调的惯例,其中回调的第一个参数是错误,第二个是数据。您的第一个代码段将如下所示:

var userDA = require('./../DataAccess/UserDA');
module.exports = {
    signUpUser: function(userGiven, callback) {
        //Some bookeeping
        userGiven.userType = "admin";
        userDA.save(tutorGiven, callback);
    }
}

现在,您可以这样致电signUpUser

var userRepo = require('<PATH TO FILE>');
var someUser = {};
userRepo.signUpUser(someUser, function(err, user) {
    if (err) {
        // oops!
    }

    // do whatever you need to accomplish after the user is signed up
});