Mongodb 如何在光纤内的集合中插入

Mongodb 如何在光纤内的集合中插入,mongodb,meteor,Mongodb,Meteor,试图在数据库中创建一个新条目,但我不断收到一个错误,关于我的代码不在光纤中。我不知道问题出在哪里。我必须补充一点,我正在服务器端进行插入。这不是来自客户端的方法调用 这是我的密码 import {Meteor} from 'meteor/meteor'; import {Mongo} from 'meteor/mongo'; import SimpleSchema from 'simpl-schema'; export const Trxs = new Mongo.Collection

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

这是我的密码

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环境的上下文

在服务器上处理异步函数时通常会出现这种情况。出现上述错误的原因是,还有一个调用
Mongo.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
    });
});
import {addTrx, Trxs} from "./modc";


setTimeout(function () {
    console.log("call")
    addTrx({
        category_id: "12312321",
        amount: 10000,
        name: "foo",
    }, '123123123')
}, 5000);
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);
如果要删除函数的
bindEnvironment
包装,main.js中的代码将抛出与您收到的相同的错误

供进一步阅读的资源:


您是否尝试过不带箭头功能的功能?由于光纤在特定的上下文中工作,它可能无法在箭头函数中工作…?在没有箭头函数的情况下仍然会遇到相同的问题。
Meteor.bindEnvironment
应该做一些技巧,但Meteor.method中的每件事都要做,然后从任何地方调用方法。。控制台/外壳、客户端或服务器。如果您必须在Meteor方法之外工作,并且必须调用Mongo集合(例如,您编写了包含公共代码的包),则需要使用
bindEnvironment
包装该方法。