2012-06-07 26 views
0

我有点困惑与我的代码它不同步,因为它应该是。我使用everyauth来进行身份验证。函数不能在nodejs中同步工作?

registerUser(function(newUserAttrs) { 
     var login = newUserAttrs[this.loginKey()]; 
     user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) { 
      if(!err) { 
       return usersByLogin[login] = newUserAttrs; 
      } 
      else { 
       throw err; 
      } 

     }); 

    }) 
在另一个文件

我写这篇文章的代码

exports.CreateNewUser = function(login, pass, mail, callback) { 

    var sql = "insert into `user`(login,mail,pass) values(?,?,?)"; 
    client.query(sql, [login, mail, pass], function(err, results, fields) { 
     if(!err) { 
      callback(results); 
      console.log('test') 
     } 
     else { 
      callback(results, err); 
     } 
    }); 
}; 

此代码工作正常。我测试了他。唯一的问题是他们正在同步工作(正常情况)。有人能解释我做了什么事情,以错误的方式使它异步。我想以同步的方式完成它。

当前的代码给我的错误(这是使数据库中的条目,并在浏览器中产生错误)

Error: Step registerUser of `password` is promising: userOrErrors ; however, the step returns nothing. Fix the step by returning the expected values OR by returning a Promise that promises said values. 
    at Object.exec (E:\proj\Node\node_modules\everyauth\lib\step.js:68:11) 
    at E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:26:38 
    at [object Object].callback (E:\proj\Node\node_modules\everyauth\lib\promise.js:13:12) 
    at RouteTriggeredSequence._bind (E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:25:20) 
    at RouteTriggeredSequence.start (E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:52:33) 
    at RouteTriggeredSequence.routeHandler (E:\proj\Node\node_modules\everyauth\lib\routeTriggeredSequence.js:13:13) 
    at Object.<anonymous> (native) 
    at nextMiddleware (E:\proj\Node\node_modules\connect\lib\middleware\router.js:175:25) 
    at param (E:\proj\Node\node_modules\connect\lib\middleware\router.js:183:16) 
    at pass (E:\proj\Node\node_modules\connect\lib\middleware\router.js:191:10) 

感谢

+3

我不知道这里有什么问题,但在节点的约定是执行'回调(错误,结果)'而不是'回调(结果,错误)'。 – alessioalex

回答

1

您呈现的两段代码是异步的而不是同步的! 使用everyauth,为了能够处理异步用户创建,您应该使用Promise。所以你的代码会是这样的:

registerUser(function(newUserAttrs) { 
    var promise = this.Promise(); 
    var login = newUserAttrs[this.loginKey()]; 
    user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) { 
     if(!err) { 
      return promise.fulfill(newUserAttrs); 
     } 
     else { 
      promise.fulfill(user); 
     } 

    }); 

}) 

没有承诺,你不能确定你的新用户已被添加到你的数据库。但如果没关系,你可以有这样的事情:

registerUser(function(newUserAttrs) { 
    var login = newUserAttrs[this.loginKey()]; 
    user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) { 
     if (err) console.log(err); 
    }); 
    return newUserAttrs; 

}) 
1

因为你正在做一个数据库查询,该代码必须是异步的。在数据库查询完成之前,您传递给client.query的匿名函数将不会被调用,因此您的callback将被异步调用。

您将需要将这一切都视为异步,因此您必须触发一些其他回调,而不是返回用户对象/抛出。