包装Collection.insert

时间:2017-07-21 15:13:25

标签: javascript meteor

我在Meteor.js中有这个方法“main.js - Server”。

Meteor.methods({
  messageSent: function (message) {
    var apiai = require('apiai');

    var app = apiai("TOKEN");
    var request = app.textRequest(message, {
      sessionId: '<unique session id>'
    });

    request.on('response', function(response) {
      console.log(response);
      console.log(response.result.fulfillment.speech);
      Meteor.wrapAsync(gateway.transaction.sale);
      Messages.insert({
        message: response.result.fulfillment.speech,
        timestamp: new Date(),
        username: 'gotoAndBot'
      });
    });

    request.on('error', function(error) {
      console.log(error);
    });

    request.end();
  }  
});

从api.ai得到答案并尝试将api.ai的答案添加到Collection中。

但这会返回错误:

  

错误:流星代码必须始终在光纤内运行。尝试使用Meteor.bindEnviorment包装传递给非Meteor库的回调。

这是由Messages.insert行引起的。

1 个答案:

答案 0 :(得分:1)

正如评论中已经建议的那样,答案是将回调包装在Meteor.bindEnvironment中,以便它在附加了所有必要变量的光纤内运行。所以你的代码是:

Meteor.methods({
  messageSent: function (message) {
    var apiai = require('apiai');

    var app = apiai("TOKEN");
    var request = app.textRequest(message, {
      sessionId: '<unique session id>'
    });

    request.on('response', Meteor.bindEnvironment(function(response) {
      Messages.insert({
        message: response.result.fulfillment.speech,
        timestamp: new Date(),
        username: 'gotoAndBot'
      });
    }));

    request.on('error', function(error) {
      console.log(error);
    });

    request.end();
  }  
});