2017-02-10 10 views
1

Ich versuche, den Highscore-Post eines Users zu bekommen. Um dies zu tun, frage ich das Post Modell, finden Beiträge mit ihrer user._id als author in der Post.Warum wird nicht ausgewählt (Mungo-Abfrage) funktioniert?

Das funktioniert ganz gut.

Allerdings möchte ich nur die _id und die voteCount des Beitrags greifen. Aus irgendeinem Grund eine select Hinzufügen wirft nur Fehler und sagt, dass es eine unprocessable entity

Hier ist die Abfrage:

getHighscorePost(req, res, next) { 
    const firebaseUID = req.params.uid; 

    User.findOne({ firebaseUID }) 
     .select('_id') 
     .then(user => { 
      Post.find({ author: user._id }) 
      .select('_id, voteCount') 
      .sort({ voteCount: -1 }) 
      .limit(1) 
      .then(post => res.send(post[0])) 
      .catch(next); 
     }) 
     .catch(next); 
    } 

Ich habe versucht, die select vor/nach jedem der limit und sort Optionen setzen.

Wenn ich die select weglassen, dann protokolliert die Post-Konsole einfach gut so;

{ _id: '589ddffeb4a1477fa04d632a', 
    author: '589ddffeb4a1477fa04d6326', 
    text: 'This is post two. It belongs to Matt too', 
    createdAt: 2, 
    expiresAt: 1000000000000000000, 
    university: 'University of Aberdeen', 
    voteCount: 3, 
    uniOnly: false, 
    __v: 0, 
    categories: [ 'music' ], 
    votes: [], 
    commenters: [], 
    comments: [], 
    expired: false, 
    commentCount: 0, 
    id: '589ddffeb4a1477fa04d632a' } 

Mit dem select hinzugefügt, ich habe nichts in den Körper gelangen. Der Fehler kommt zurück als:

{ error: 'Cannot read property \'length\' of undefined' } 

Was passiert hier?

Danke

+0

Ein paar Kommentare: Sie brauchen nur die äußere '.catch (next)', es wird auch Fehler von der inneren Versprechen zu fangen. Sie sollten auch 'Post.find' zurückgeben. Versuchen Sie, '.exec()' zur Abfrage vor '.then() 'hinzuzufügen. – ChemicalRocketeer

Antwort

2

Ich denke, dass Sie nicht Semikolon in Ihrem wählen müssen. Anstatt also diese:

.select('_id, voteCount')

Ihr wählen sollte wie folgt aussehen:

.select('_id voteCount')

Wenigstens würde ich sagen auf docs so basiert.

+0

Immer noch nicht funktioniert :( – bloppit

+0

Ich mache das, aber es gibt mir nur den gleichen Fehler? – bloppit

1

Die _id sollte standardmäßig enthalten sein. Sie können versuchen:

.select('voteCount') 
+0

Immer noch nicht funktioniert :( – bloppit

+0

Ich mache das, aber es gibt mir nur den gleichen Fehler? – bloppit

1

Sie

Post.find({ author: user._id }, {voteCount: 1}) 

Sie nicht brauchen _id = 1 setzen können, wie es in der Ausgabe von Standard sein wird, aber für den Fall, wenn Sie nicht wollen, _id In deiner Ausgabe solltest du _id = 0 setzen. Hier

ist der vollständige Code:

getHighscorePost(req, res, next) { 
    const firebaseUID = req.params.uid; 

    User.findOne({ firebaseUID }) 
     .select('_id') 
     .then(user => { 
      Post.find({ author: user._id }, {voteCount: 1}) 
      .sort({ voteCount: -1 }) 
      .limit(1) 
      .then(post => res.send(post[0])) 
      .catch(next); 
     }) 
     .catch(next); 
    } 

Hoffentlich sollte es gut funktionieren, aber irgendwie, lassen Sie mich wissen, ob das funktioniert.

+0

Immer noch nicht funktioniert :( – bloppit

+0

I mache ich das, aber es gibt mir nur den gleichen Fehler? – bloppit

Verwandte Themen