2

以下のような Message という名前のスキーマがあります。

Message = new Schema({
    id: Number,
    sender: ObjectId,
    receiver: ObjectId,
    date: Date,
    content: String,
    type: Number
});

そして、以下のような User スキーマ;

User = new Schema({
 id: Number,
 username: String,
 isOnline: Boolean
});

新しいメッセージを受信したときに、メッセージ アイテムの送信者と受信者のプロパティを設定したいと考えています。メッセージを受信したら、新しいメッセージ ドキュメントを作成し、そのプロパティを設定しています。しかし、送信者と受信者のプロパティ (ユーザー ドキュメント内のエンティティへの参照である必要があります) を設定する方法がわかりません。私が使用しているコードは以下のようなものです。好きなだけコードを判断できます。それが私が望んでいることです。私はそれを取り除く正しい方法を知りません。しかし、これはそうではないようです。以下のコードを使用しているときに、送信者と受信者のプロパティが設定されていることを確認できませんでした。findOne が非同期だからではないかと思います(そうかどうかはわかりません)。

var m = new Message();
m.content = messageData.text;
m.id = messageId;
User.findOne({id: socket.userId}, function (e, o) {
  m.sender = o;
});

User.findOne({id: messageData.userId}, function (e, o) {
  m.receiver = o;
});

m.save(function (e) {
  if (!e) {
    console.log("message is saved to the mongodb...");
  }
});

これを行う正しい方法を教えていただければ幸いです。

前もって感謝します。

4

1 に答える 1

2

もうすぐです。あなたは正しいです、それfindOneは非同期です。あなたは彼らのコールバックのハンドルを取得し、彼らが両方とも応答した後にメッセージを保存する必要があります。使用できる典型的なパターンは次のとおりです。

var m = new Message();
m.content = messageData.text;
m.id = messageId;
User.findOne({id: socket.userId}, function (e, o) {
  if (e) return handleError(e); // assuming you want to handle errors somehow
  m.sender = o;
  m.sender && m.receiver && save();
});

User.findOne({id: messageData.userId}, function (e, o) {
  if (e) return handleError(e); // assuming you want to handle errors somehow
  m.receiver = o;
  m.sender && m.receiver && save();
});

function save () {
  m.save(function (e) {
    if (e) return handleError(e);
    console.log("message is saved to the mongodb...");
  });
}
于 2012-04-18T17:39:13.713 に答える