2017-07-08 11 views
0

Ich baue eine App, wo ich Nachrichten als Unterdokumente in einem Chatroom hinzufügen muss. Ich muss die Daten des Unterdokuments zurückgeben, sobald ich es in den vorhandenen Raum einfüge. dies ist mein CodeDas eingefügte Unterdokument zurückgeben

Room.findOne({ roomname: data.room }, (err, room) => { 
    room.messages.push({ username: data.username, message: data.message }); 
    room.save((err, room) => { 
     socket.broadcast.to(data.room).emit("new message", { 
      username: room.messages.slice(-1).name, 
      message: room.messages.slice(-1).message, 
      createdat: room.messages.slice(-1).createdat 
     }); 
    }); 
    }); 

So dies der Code habe ich verwendet letzte Unter Dokument abgerufen werden. Gibt es einen anderen Weg, dies zu erreichen?

Antwort

1

Verwenden .findOneAndUpdate() mit $push zu verwenden. Auf diese Weise berühren Sie die Datenbank nur "einmal" und vermeiden außerdem das Problem, dass möglicherweise etwas anderes das Dokument ändert und am Ende überschrieben wird. Dies vermeidet die Gefahr der .find() dann .save() Muster:

Room.findOneAndUpdate(
    { roomname: data.room }, 
    { "$push": { 
    "messages": { username: data.username, message: data.message } 
    }}, 
    { "new": true }, 
    (err, room) => { 
    let message = room.messages.slice(-1)[0]; 
    socket.broadcast.to(data.room).emit(
     "new message", 
     Object.keys(message).filter(k => k !== "_id") 
     .reduce((acc,curr) => Object.assign(acc,{ [curr]: message[curr] }),{}) 
    ); 
    } 
); 

Auch nur .slice(-1)[0] das ganze Objekt zu erhalten und es nur zurückkehren, oder die unerwünschten Tasten herauszuzufiltern wie oben gezeigt.

Oder auch einfach nur zurückkehren alle Felder aus dem Array-Element und $slice das Array aus der Abfrage vom Server zurück:

Room.findOneAndUpdate(
    { roomname: data.room }, 
    { "$push": { 
    "messages": { username: data.username, message: data.message } 
    }}, 
    { "new": true, "fields": { "messages": { "$slice": -1 } } }, 
    (err, room) => { 
    socket.broadcast.to(data.room).emit(
     "new message", room.messages[0] 
    ); 
    } 
); 
+0

Lun dies einen Syntaxfehler ' Syntax gibt: bei unerwartetes Token * * (** äh, Zimmer) => {' – TRomesh

+0

@TRomesh Ich habe mich einen Moment lang gefragt, wo. Zweites Beispiel war ein '}'. Korrigiert. Bedient mich hier richtig, anstatt direkt einen externen Redakteur einzutippen. –

1
room.messages.slice(-1).name 

Dies ist falsch, Demo unter

[1,2,3].slice(-1) 
// returns [3], not 3 

Sie haben noch Index statt

room.messages.slice(-1)[0].name 
// or simply 
room.messages[room.messages.length - 1].name 
Verwandte Themen