2012-04-18 61 views
2

我有一個模式命名爲如下所示的消息;如何在貓鼬中設置objectId屬性?

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..."); 
    } 
}); 

如果你能說出正確的方法來做到這一點,那將是一件好事。

在此先感謝。

回答

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..."); 
    }); 
} 
+0

謝謝!我瞭解你的方法。但該方法似乎有點混亂。這是做到這一點的唯一方法嗎?因爲可能會有更多的字段,如發件人和收件人。我是否應該爲他們每個人做同樣的事情?沒有任何和像m.sender = new User({id:socket.userId}); ? – 2012-04-19 08:36:54

+0

正如我已經研究了一些,我發現了一個node.js的異步插件,它與您在其他未來期間提出的一樣。猜猜,在那裏似乎沒有任何其他解決方案。 – 2012-04-19 10:01:34