生产中的服务器上不调用Meteor方法

时间:2017-09-05 15:59:15

标签: meteor

我有一个在开发中运行良好的方法,但是一旦部署,该方法就会停止接收呼叫。

在客户端上调用console.log。我可以在浏览器控制台中看到它。但是服务器日志没有upsertTurn。

有人想知道为什么或如何调试它?

以下是示例代码:

imports / api / turns.js:(在客户端和服务器中导入)

Meteor.methods({
  upsertTurn(turn) {
    console.log('upsertTurn', this.userId);
    if(this.userId) {
      return Turns.update(
        { _id: turn._id },
        { $set: _.omit(turn, '_id') },
        { upsert: true, multi: false }
      );
    }
  },
});

更新1 : 我清空了生产数据库,它开始工作...... 看起来发布复合出版物在服务器上施加了很高的负载,然后方法调用计算挂起。

更新2:

export const OpcoTurns = (userId) => { return Turns.find( OpcoTurnsQuery( userId ) ); };

const OpcoTurnFlights = (turn) => {
  return Flights.find( TurnFlightsQuery( turn ), FlightsSort );
};

const TurnFlightsQuery = (turn) => {
  if(turn) {

    const turnEnd = m(turn.started).add(turn.duration, 'hours').toDate();
    return {
      $and: [{
        $or: [
          { itia: { $gt: turn.started } },
          { itis: { $gt: turn.started} }
        ]
      }, {
        $or: [
          { itia: { $lt: turnEnd } },
          { itis: { $lt: turnEnd } }
        ]
      }, {
        appType: new User().user.profile.appType
      }, {
        $or: [
          { turnID: null },
          { turnID: turn._id }
        ]
      }]
    };

    //example with values:
    // { $and: [{ $or: [ { itia: {$gt: Date("2016-06-30T14:47:48.536Z")}}, {itis: {$gt: Date("2016-06-30T14:47:48.536")}} ]}, { $or: [ {itia: {$lt: Date("2016-06-30T22:47:48.536Z")}}, {itis: {$lt: Date("2016-06-30T22:47:48.536Z")}} ] },{ appType: 0 }] }

  }
};

Meteor.publishComposite("OpcoTurnFlights", {
  find: function() {
    if(this.userId) return OpcoTurns(this.userId);
    return;
  },
  children: [
    { find: function(turn) { return OpcoTurnFlights(turn); } }
  ]
});

2 个答案:

答案 0 :(得分:0)

尝试将你的代码放入try cath中,然后使用console.log(e)我知道你可以看到有一些错误

try {
    console.log('upsertTurn', this.userId);

if(this.userId) {

  return Turns.update(
    {
      _id: turn._id
    },
    {
      $set: _.omit(turn, '_id')
    },
    {
      upsert: true,
      multi: false
    }
  );
}
} catch (e) {
  console.log(e)
} 

答案 1 :(得分:0)

根据publish-composite文档,您的find ...

  

必须返回第二层文档的光标。

find: function() {
    if(this.userId) return OpcoTurns(this.userId);
    return;
  },

如果this.userId为空,则永远不会返回游标,publish-composite可能会引爆。这是最直接可疑的一行。

解决方案1 ​​:请勿使用publish-composite。如果必须,请解决此问题。

此外,我怀疑您在客户端的turn中发送了Meteor.call("upsertTurn", ...)个对象。您是否正在使用此turn对象执行任何操作,包括可能添加EJSON无法序列化的字段?

解决方案2 :不要将方法设计为接受整个文档。

关于清空数据库,它可能只是重置了经过身份验证和未经身份验证的状态之间的调用模式。这可以打破/破坏您的publish-composite。它实际上不应该具有性能影响,因为在Mongo或Meteor中没有50个文档。