0

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

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 的新手,我想知道如果我采用这种设计方法会有什么问题吗?

4

1 回答 1

1

您遇到了 node.js 异步编程新手的经典陷阱。例如,考虑以下代码:

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

这将输出以下内容:

done
timer

这样做的原因是 setTimeout 正在为以后安排异步工作。实际发生的是该setTimeout函数立即返回,console.log('done')被调用,然后大约 200 毫秒后回调函数被调用并被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
});
于 2016-02-11T16:09:24.757 回答