【问题标题】:Meteor-Mongo: Error handling for findoneMeteor-Mongo:findone 的错误处理
【发布时间】:2017-03-08 02:15:07
【问题描述】:

我正在尝试在meteor-mongo 中使用findOne 处理错误。

this stackoverflow question 看来,我应该能够通过执行collection.findOne({query}, function(err, result){ <handleError> } 来处理错误,但这样做会导致错误消息:

“匹配错误:Match.OneOf、Match.Maybe 或 Match.Optional 验证失败”

以下代码有效:

export default createContainer((props) => {
  let theID = props.params.theID;
  Meteor.subscribe('thePubSub');
  return {
    x: theData.findOne({_id: theID}),
  };
}, App);

以下代码没有:

export default createContainer((props) => {
  let theID = props.params.theID;
  Meteor.subscribe('thePubSub');
  return {
    x: theData.findOne({_id: theID}, function(err,result){
      if(!result){
        return {}
      };
    }),
  };
}, App);

我做错了什么,我应该如何解决这个错误?这是特定于流星的错误吗?

非常感谢任何帮助!

【问题讨论】:

  • 那个匹配错误看起来像是由服务器上的匹配包生成的。您在浏览器控制台或服务器控制台中看到该错误吗?
  • 嗨@zim,谢谢你的回复。这个错误是在浏览器控制台产生的

标签: mongodb meteor


【解决方案1】:

你到底想用你的回调处理什么样的错误?

Meteor's findOne 与您链接到的帖子使用的节点的mongodb 驱动程序的findOne 不同。

预期的签名是:

collection.findOne([选择器], [选项])

不涉及回调,因为该方法是同步运行的(但是是反应式的)。

如果你想在找不到文档的时候返回一个默认值,你可以简单地使用一个JS逻辑OR:

// Provide an alternative value on the right that will be used
// if the left one is falsy.
theData.findOne({_id: theID}) || {};

更严格的方法是将其类型与

typeof queryResult === 'undefined'

请注意,如果 theData 集合是由上述订阅 Meteor.subscribe('thePubSub') 提供的,我怀疑 Meteor 是否有时间在您查询时在客户端上填充集合……

【讨论】:

  • 如果找不到 id,我正在尝试处理错误。如果我想区分文档是 undefined 还是尚未查询该文档,我应该怎么做?
  • “尚未被查询”是什么意思?
  • 意思是,如果我加载组件并启动createContainer 函数,我的文档x 还没有准备好,但如果正在查询的id 有效,很快就会准备好。但是,如果查询的 id 无效,则 x 将变为未定义。系统如何知道文档是由于初始延迟时间还是在查询失败之后未定义?
  • 那么您可能正在寻找Meteor.subscribeonReady 回调,该回调将在您的服务器发布的客户端receives a full snapshot 时执行。
  • 刚刚看到编辑后的回复。逻辑或就可以了。非常感谢!
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2016-08-18
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多