2016-11-29 30 views
1

我正在使用vpulim:node-soap来运行soap服务器。流星服务器中的异步功能

我的流星服务器启动包含此之间的各种其他代码:

authRequestOperation: function(args,cb,headers,req) { 
     console.log(args); 
     var authResponceObject = {}; 
     var futureAuthResponse = new Future(); 
     Fiber(function(){ 
     if(collectorUsers.findOne({username: args.username})){ 
      console.log("Found User"); 
      authResponceObject = { 
      username: args.username, 
      nonce: Random.id() 
      }; 
      console.log("authResponceObject is: " + JSON.stringify(authResponceObject,null,4)); 
      console.log("futureAuthResponse returning..."); 
      futureAuthResponse.return(authResponceObject); 
     } 
     // console.log("futureAuthResponse waiting..."); 
     // return futureAuthResponse.wait(); 


     }).run(); 
     console.log("authResponceObject after fiber is: " + JSON.stringify(authResponceObject,null,4)); 
     return authResponceObject; 
    }, 

我试图做的是:

  1. 我收到一个用户对象从客户端。
  2. 我检查用户是否存在于所述的mongodb
  3. 如果用户在场,准备响应对象
  4. 响应与该响应对象客户端。

我有1.工作。然而,它是异步调用,2,3,4的顺序搞砸了。

眼下发生的事情是:

  1. 收到客户对象
  2. 返回响应对象(里面是空的)
  3. 检查蒙戈
  4. 准备响应对象。

我没有使用上面的Meteor.methods。 如何以正确的方式完成这项工作?我试过在wrapAsyncfiber/future周围玩耍,但都是死路一条。

+0

为什么你使用'Fiber'上面的代码? '.findOne'已经同步。如果不使用“Fiber”,你会看到错误吗? – Khang

+0

由于我运行Meteor.methods之外的代码,因此我需要将其包装在Fiber中。否则我得到一个错误,说Meteor需要使用光纤运行。 – blueren

回答

1

我相信Meteor.bindEnvironment可以解决你的问题,试试这个代码:

{ 
    // ... 
    authRequestOperation: Meteor.bindEnvironment(function(args, cb, headers, req) { 
    console.log(args); 
    var authResponceObject = {}; 

    if (collectorUsers.findOne({username: args.username})) { 
     console.log("Found User"); 
     authResponceObject = { 
     username: args.username, 
     nonce: Random.id() 
     }; 
     console.log("authResponceObject is: " + JSON.stringify(authResponceObject, null, 4)); 
    } 


    return authResponceObject; 
    }), 
    // ... 
} 
+0

这个伎俩。谢谢。 – blueren