我正在尝试设置一个mongo,node和redis服务器,除了看似加载旧数据的Redis缓存外,一切都运行良好。
将Redis取出并使用纯Mongo返回正确的数据,如果我再次单击提交,它将加载先前提交的数据,因此我知道缓存和Mongo正在更新。
这是我使用Mongo和Redis更新用户的当前代码...
updateUserById: (newUser, redis, id, callback) => {
User.findByIdAndUpdate(id, {
$set: {
"firstName": newUser.firstName,
"lastName": newUser.lastName,
"email": newUser.email
}
}, (err, doc) => {
if (err) { throw new Error(err); }
else if (!doc) { callback('No user with that ID to update cache.') }
else {
redis.set(id, JSON.stringify(doc), (err) => {
console.log('Caching updated user ' + id);
if (err) { callback(err); throw new Error(err); }
else {
const result = {
"success": "true",
"message": "User updated successfully"
};
callback(result);
}
})
}
});
}
这是redis和Mongo返回用户信息......
userById: async (redis, id, callback) => {
redis.get(id, async (err, reply) => {
if (err) {
callback(null); throw new Error(err);
} else if (reply) {
callback(JSON.parse(reply));
} else {
await User.findById(id, (err, doc) => {
if (err || !doc) { callback(null); throw new Error(err); }
else {
redis.set(id, JSON.stringify(doc), () => {
callback(doc);
})
}
})
}
})
}
我发现它与包含doc
updateUserById
有关
答案 0 :(得分:0)
问题出在更新方法中。
当文档被传递时,它传递的是旧数据而不是新数据。为了反击行为,我使用了传递给方法的newUser。
以下是更新后的代码:
updateUserById: (newUser, redis, id, callback) => {
User.findByIdAndUpdate(id, newUser, (err) => {
if (err) { throw new Error(err); }
else {
redis.set(id, JSON.stringify(newUser), (err) => {
console.log('Caching updated user ' + id);
if (err) { callback(err); throw new Error(err); }
else {
const result = {
"success": "true",
"message": "User updated successfully"
};
callback(result);
}
})
}
});
}
答案 1 :(得分:0)
使用new
选项可用于返回新文档。
Mongo在更新后默认返回旧文档。
要返回新文档mongo选项new
可能很有用
用法:Model.findByIdAndUpdate(id,update,{new:true});
updateUserById: (newUser, redis, id, callback) => {
User.findByIdAndUpdate(id, {
$set: {
"firstName": newUser.firstName,
"lastName": newUser.lastName,
"email": newUser.email
}
},{ new : true }, (err, doc) => {
if (err) { throw new Error(err); }
else if (!doc) { callback('No user with that ID to update cache.') }
else {
redis.set(id, JSON.stringify(doc), (err) => {
console.log('Caching updated user ' + id);
if (err) { callback(err); throw new Error(err); }
else {
const result = {
"success": "true",
"message": "User updated successfully"
};
callback(result);
}
})
}
});
}