gpt4 book ai didi

node.js - 为什么 "res.send"给我旧版本的 Mongoose 文档?

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:31 26 4
gpt4 key购买 nike

我有一个快速 API 端点,可以删除帖子。我附加了一个 mongoose pre-hook,它又删除了对 Comment 模型的引用和 User 模型的引用:

PostSchema.pre("remove", async function() {
await Comment.remove({ _postId: this._id }).exec();
await User.update({ $pull: { _posts: this._id } }).exec();
});

当删除 Post 时,此 Hook 成功删除对 CommentUser 模型的所有引用。但是,当我将 User 模型作为响应发送回用户 (res.send(user)) 时,我仍然获得对 Post 的引用。我知道发送的是旧版本,因为当我手动查询数据库时,我发现 Post 引用实际上已被删除。

API 如下所示:

  app.delete(
"/api/posts/:postId",
requireAuth,
async (req, res, next) => {
try {
const post = await Post.findById(req.params.postId);
if (post._userId.equals(req.user._id)) {
await post.remove();
const user = await req.user.save();
res.send(req.user);
} else {
res.send("Error:", "This post does not belong to you");
}
} catch (err) {
next(err);
}
}
);

(注意requireAuth是一个中间件,使用passportjs获取jwt并反序列化用户)

最佳答案

  1. requireAuth 中,您从数据库获取 User 并将其存储在 req.user
  2. await post.remove(); 您从用户中删除了帖子和帖子引用,一切正常
  3. const user = wait req.user.save(); - 您正在将旧用户(从 no1 抓取)保存到数据库。不好。在执行任何其他操作之前,您必须更新存储在 req.user 中的 User 对象。 req.user 仍然存储旧版本的 User。

在我看来,而不是

const user = await req.user.save();

您应该从数据库中获取新用户(查找),将新用户分配给 req.user 并最终将其传递给 res.send(user)

  app.delete(
"/api/posts/:postId",
requireAuth,
async (req, res, next) => {
try {
const post = await Post.findById(req.params.postId);
if (post._userId.equals(req.user._id)) {
await post.remove();
const user = await User.findById(req.user._id).exec();
req.user = user;
res.send(req.user);
} else {
res.send("Error:", "This post does not belong to you");
}
} catch (err) {
next(err);
}
}
);

关于node.js - 为什么 "res.send"给我旧版本的 Mongoose 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49485451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com