如何在光纤中插入Collection

时间:2018-03-19 03:32:30

标签: mongodb meteor

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

这是我的代码。

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。

1 个答案:

答案 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