Meteor: Match error: Failed Match.OneOf or Match.O

2019-04-28 17:58发布

I have a website that uses Meteor 0.9. I have deployed this website on OpenShift (http://www.truthpecker.com).

The problem I'm experiencing is that when I go to a path on my site (/discover), then sometimes (though not always), the data needed are not fetched by Meteor. Instead I get the following errors:

On the client side:

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

And on the server side:

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]

Can anyone help me to eliminate this error and get the site working? I'd be very grateful!

Tony

P.S.: I never got this error using localhost.

EDIT:

The line causing the problem the problem is this (line 41):

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

One document in the activities collection looks like this:

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

When I run the query done in line 41 in mongo shell, I get the following error:

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

I don't really why this is though. Can you help me there as well? Thank you.

3条回答
干净又极端
2楼-- · 2019-04-28 18:23

You have a document on your website that does not match your check validation.

The validation you have is in app/server/publications.js:41

So the attribute in question exists in some way like Match.optional(Match.oneOf(xx)) but the document's attribute is neither of the values in Match.oneOf

You would have to go through your documents for the collection causing this and remove or correct the attribute causing this to match your check statement.

Update for your updated question.

You're running Meteor commands in the meteor mongo/mongo shell. The error you get is unrelated to the problem in Meteor, to sort in the mongo shell you would do activities.find(..).sort(), instead of activities.find(.., { sort : {..}). This is unrelated to the issue

The issue is most-likely that your id is not actually a string. Its supposed to be sEDDreehonp67haDg for the document you're looking for. You might want to use the debugger to see what it actually is.

查看更多
走好不送
3楼-- · 2019-04-28 18:35

Make sure that you are passing an integer to skip and limit. Use parseInt() if need be.

查看更多
倾城 Initia
4楼-- · 2019-04-28 18:38

I don't think you can use limit in client-side find queries. Removing limit from my query solves the problem. If you're looking for pagination, then you can either manually roll your own by passing a parameter to your Activities publication so that the limit is added to the server-side query along with an offset. There is also this pagination package.

查看更多
登录 后发表回答