我正在开发聊天应用程序,会话中的每个事件都有一个名为sender的字段-看起来像这样:
var eventSchema = Schema({
sender: {
type: {}, //username && user_id fields
required: true
}
}每次创建事件时,我都会为发送者字段传入如下所示的对象:
{
username: String,
user_id: ObjectId("")
}我确信Event.sender中的user_id字段每次都是ObjectId类型。
但是,在数据库中,保存的事件有时会有String &类型的Event.sender.user_id,而有时Event.sender.user_id会保存为ObjectId()类型。
{
username: String,
user_id: ObjectId("") // sometimes it saves like this
}
{
username: String,
user_id: String // other times it saves like this
}这种变化发生得相当频繁,并且有由同一用户发送的事件,在10分钟的时间范围内通过相同的控制器功能表现出这种变化。
在Mongoose中有没有我没有考虑到的影响ObjectIds如何在模式的混合类型字段中保存的特定行为?
此行为在保存时发生,而不是在更新时发生。未对系统中的Event.sender字段进行更新。
发布于 2014-11-23 02:14:51
所以答案相当模糊,因为它在我们的开发环境中对我们是隐藏的。只有当Node进程被集群化时,问题才会发生,这是我们真正在生产中看到的。事实证明,我们传递给Mongoose的是user_id的一个字符串版本,所以问题出在我们对Redis Store机制的工作原理缺乏了解。
在生产中,我们使用redis store来管理socket.io的跨节点进程的会话。因此,在握手过程中,http请求可能会到达与最初开始握手时不同的进程。Redis Store然后将握手对象串化,并将其发送到所有其他正在运行的进程。
由于这个字符串符,我们在应用程序中的许多地方使用的user_id上的ObjectId包装器丢失了,我们最终在发送器对象中为许多事件保存了字符串。
希望这能帮助下一个人。
https://stackoverflow.com/questions/27024511
复制相似问题