2016-11-29 29 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