【问题标题】:Meteor: Match error: Failed Match.OneOf or Match.Optional validation (websocket)Meteor:匹配错误:失败的 Match.OneOf 或 Match.Optional 验证(websocket)
【发布时间】:2014-09-29 16:49:34
【问题描述】:

我有一个使用 Meteor 0.9 的网站。我已经在 OpenShift (http://www.truthpecker.com) 上部署了这个网站。

我遇到的问题是,当我转到我网站上的路径 (/discover) 时,有时(尽管并非总是如此)所需的数据不会被 Meteor 获取。相反,我收到以下错误:

在客户端:

WebSocket connection to 'ws://www.truthpecker.com/sockjs/796/3tfowlag/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400 

在服务器端:

Exception from sub rD8cj6FGa6bpTDivh Error: Match error: Failed Match.OneOf or Match.Optional validation
    at checkSubtree (packages/check/match.js:222)
    at check (packages/check/match.js:21)
     at _.extend._getFindOptions (packages/mongo-livedata/collection.js:216)
    at _.extend.find (packages/mongo-livedata/collection.js:236)
    at Meteor.publish.Activities.find.user [as _handler] (app/server/publications.js:41:19)
    at maybeAuditArgumentChecks (packages/livedata/livedata_server.js:1492)
    at _.extend._runHandler (packages/livedata/livedata_server.js:914)
    at _.extend._startSubscription (packages/livedata/livedata_server.js:764)
    at _.extend.protocol_handlers.sub (packages/livedata/livedata_server.js:577)
    at packages/livedata/livedata_server.js:541
Sanitized and reported to the client as: Match failed [400]

谁能帮我消除这个错误并让网站正常运行?不胜感激!

托尼

P.S.:我在使用 localhost 时从来没有遇到过这个错误。

编辑:

导致问题的行是这样的(第 41 行):

return Activities.find({user: id}, {sort: {timeStamp: -1}, limit:40});

活动集合中的一个文档如下所示:

{
    "user" : "ZJrgYm34rR92zg6z7",
    "type" : "editArg",
    "debId" : "wtziFDS4bB3CCkNLo",
    "argId" : "YAnjh2Pu6QESzHQLH",
    "timeStamp" : ISODate("2014-09-12T22:10:29.586Z"),
    "_id" : "sEDDreehonp67haDg"
}

当我在 mongo shell 中运行第 41 行完成的查询时,我收到以下错误:

error: { "$err" : "Unsupported projection option: timeStamp", "code" : 13097 }

我真的不知道为什么会这样。你也可以帮我吗?谢谢。

【问题讨论】:

    标签: meteor websocket openshift


    【解决方案1】:

    确保将整数传递给skiplimit。如果需要,请使用parseInt()

    【讨论】:

      【解决方案2】:

      您网站上的文档与您的check 验证不匹配。

      你的验证在app/server/publications.js:41

      因此,有问题的属性以某种方式存在,例如 Match.optional(Match.oneOf(xx)),但文档的属性既不是 Match.oneOf 中的值

      您必须检查导致此问题的集合的文档,并删除或更正导致此问题与您的 check 语句匹配的属性。

      更新您的更新问题。

      您正在meteor mongo/mongo shell 中运行 Meteor 命令。您得到的错误与 Meteor 中的问题无关,要在 mongo shell 中排序,您将执行 activities.find(..).sort(),而不是 activities.find(.., { sort : {..})。这与问题无关

      问题很可能是您的id 实际上不是一个字符串。对于您要查找的文档,它应该是sEDDreehonp67haDg。您可能想使用调试器来查看它的实际情况。

      【讨论】:

      • 感谢您的回答。我的出版物中没有支票声明。第 41 行是一个 MongoDB.find() 调用。我在问题中添加了我的发布代码。
      • @fritzi2000 我建议您检查id 它可能不是字符串或 mongodb id 对象。
      • 我会检查的。同时,我发现发生此错误时的第 41 行显然第 41 行是这样的: Arguments.find({flagged: {$gte: 5}}, {limit: limit}) 但是,这不会产生任何错误我在 robomongo 中运行它
      • 我在 robomongo 中使用字符串作为 id 运行命令,我得到了完全相同的错误。问题似乎是排序。
      • @fritzi2000 这可能不太可能。您在 Meteor 中使用的命令与在 mongo 控制台中的操作方式不同。 mongo 控制台下的第二个选项(投影)xx.find(query, projections),即 Meteor 中的 options,这就是您看到错误不支持投影选项的原因。这些命令并不完全可互操作
      【解决方案3】:

      我认为您不能在客户端查找查询中使用limit。从我的查询中删除 limit 可以解决问题。如果您正在寻找分页,那么您可以通过将参数传递给您的活动发布来手动滚动您自己的分页,以便将限制与偏移量一起添加到服务器端查询中。还有this pagination package

      【讨论】:

      • 有趣的是,我只在 Cordova 中的 iOS (8.x) 上而不是 Android (5.1.x) 上测试时发生了这种情况
      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2019-06-29
      • 2015-05-06
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多