Meteor:检索 Meteor.call 中的值,它调用具有承诺的服务器方法

Meteor : Retrieve value in Meteor.call which calls a server method having promise

我有一个内部维护的 npm 包 myNpmPackage 导出一个函数(例如 fnTestMicroSerConn )如下:

const rp = require('request-promise-native')

exports.fnTestMicroSerConn = function () {
  return new Promise(function(resolve, reject) {
    var options = {
      method: 'GET',
      uri : "http://example.net", 
      resolveWithFullResponse: true,
    }
    rp(options)
      .then(function (response) {
        if (response.statusCode !== 200){
          console.error("http not 200 but : ",response.statusCode)
          resolve(false)
        } else  {
          console.info("connected successfully : "+response.body)
          resolve(response)
        }
      })
      .catch(function (err) {
          console.error("Error in establishing connectivity  : ",err)
          resolve(false)
      })
    })
}

然后我需要像这样从 Meteor 方法调用上面导出的函数:

import { Meteor } from 'meteor/meteor';
import myNpmPackage from 'myNpmPackage';

Meteor.methods({   
 foo: function () {
   myNpmPackage.fnTestMicroSerConn().then(function (response){
     console.log(" My response: ",response.body);
    return(response.body)
   })
 }
});

console.log(" My response: ",response.body); 成功执行,我可以在 服务器控制台日志 中看到预期值。所以直到这里都很好。

但是,现在我想将response.body的值传递给客户端。简而言之,当我在客户端执行以下操作时:

Meteor.call("foo", function (err, response) {
      console.log("calling foo");
      if(!err){
        console.log("response : ",response);
      } else {
        console.log("err : ",err);
      }
    })

不幸的是,目前我在客户端上 undefined console.log("response : ",response);

注意:我正在使用来自 here

的 Meteor Promise 包

如果需要更多详细信息或有任何不清楚的地方,请告诉我。我对 Promise 编码风格非常陌生,因此,这听起来像是一个菜鸟问题。

Meteor 方法由 Meteor.call 运行 同步从客户端调用以防止客户端挂起,即使提供了回调也是如此。

您的 foo 方法不会等待内部的承诺。它 运行 毫不犹豫地过去了 fnTestMicroSerConn() 调用,最终没有更多的语句要执行,结果 returning undefined。当 promise 解决并在服务器控制台上记录预期的消息时,该方法已经退出。

要获得该承诺的 resolved/rejected 结果,您可以 return 从方法到调用者的承诺,客户端将能够响应该承诺。

Meteor.methods({   
 foo: function () {
   return myNpmPackage.fnTestMicroSerConn();
 }
});

Meteor.call("foo")
  .then( response => console.log("My response: ", response.body) )
  .catch( err => console.log("err : ",err) );

流星法很强大。 API documentation方法信息量大,值得掌握