如何在 Fiber 中插入 Collection

How to insert in Collection within a Fiber

试图在数据库中创建一个新条目,但我不断收到关于我的代码不在纤程中的错误。我不知道可能是什么问题。我必须补充一点,我正在服务器端进行插入。这不是来自客户端的方法调用。

这是我的代码。

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
    });
}

这就是我遇到的错误。

Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

如果您的函数用作回调或在服务器上的回调中调用,那么它会失去 Meteor 环境的上下文。

在服务器上处理异步函数时经常会出现这种情况。出现上面的错误,是因为还有一个callMongo.Collection方法(不是原始的Mongo调用,而是根据Meteor环境改写的)

因此您需要使用 Meteor.bindEnvironment 将其包装起来。您可以轻松重现:

trx.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
    });
});

main.js

import {addTrx, Trxs} from "./modc";


setTimeout(function () {
    console.log("call")
    addTrx({
        category_id: "12312321",
        amount: 10000,
        name: "foo",
    }, '123123123')
}, 5000);

如果您要删除函数的 bindEnvironment 包装,main.js 中的代码将抛出与您收到的相同的错误。

进一步阅读的资源:

https://guide.meteor.com/using-npm-packages.html#bind-environment

https://docs.meteor.com/api/collections.html#Mongo-Collection