尝试在数据库中创建一个新条目,但我不断收到有关我的代码不在光纤中的错误。我不知道问题是什么。我必须补充说我正在服务器端进行插入。这不是来自客户端的方法调用。
这是我的代码。
import {Meteor} from 'meteor/meteor';
import {Mongo} from 'meteor/mongo';
import SimpleSchema from 'simpl-schema';
export const Trxs = new Mongo.Collection('trx');
export const addTrx = (trxn, userId) => {
var date = new Date(trxn.date).valueOf();
var userId = userId;
var catID = trxn.category_id;
var amt = trxn.amount;
var trx_name = trxn.name;
console.log(trxn);
Trxs.insert({
date,
userId,
catID,
amt,
trx_name
});
}
这是我得到的错误。
错误:Meteor代码必须始终在光纤内运行。尝试包装 使用传递给非Meteor库的回调 Meteor.bindEnvironment。
答案 0 :(得分:1)
如果您的函数用作回调或在服务器的回调中调用,则它会丢失Meteor环境的上下文。
在服务器上处理异步函数时经常会出现这种情况。发生上述错误,因为还有一个调用self
方法(不是原始的Mongo调用,而是根据Meteor环境重写)。
您需要使用Mongo.Collection
将其换行。您可以轻松地重现这一点:
<强> trx.js 强>
Meteor.bindEnvironment
<强> main.js 强>
import {Mongo} from 'meteor/mongo';
export const Trxs = new Mongo.Collection('trx');
export const addTrx = Meteor.bindEnvironment((trxn, userId) => {
var date = new Date(trxn.date).valueOf();
var userId = userId;
var catID = trxn.category_id;
var amt = trxn.amount;
var trx_name = trxn.name;
Trxs.insert({
date,
userId,
catID,
amt,
trx_name
});
});
如果要删除函数的import {addTrx, Trxs} from "./modc";
setTimeout(function () {
console.log("call")
addTrx({
category_id: "12312321",
amount: 10000,
name: "foo",
}, '123123123')
}, 5000);
包装, main.js 中的代码将抛出您收到的相同错误。
进一步阅读的资源:
https://guide.meteor.com/using-npm-packages.html#bind-environment
https://docs.meteor.com/api/collections.html#Mongo-Collection