Javascript 包装集合.insert
我在Meteor.js main.js-Server中有这个方法Javascript 包装集合.insert,javascript,meteor,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>' });
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的答案添加到集合中
但这会返回错误:
错误:Meteor代码必须始终在光纤中运行。尝试使用Meteor.bindEnviroment包装传递给非Meteor库的回调
这是由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();
}
});
这个答案可能有帮助@mparkitny,试过Meteor.wrapAsync,仍然是相同的错误。