我在 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 的答案添加到集合中。
但这会返回错误:
ERROR: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnviorment.
这是由 Messages.insert
行引起的。
最佳答案
正如评论中已经建议的,答案是将回调包装在 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();
}
});
关于javascript - 包装 Collection.insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241143/