为什么“res.send”会给我一个较旧版本的Mongoose文档?

时间:2018-03-26 06:47:07

标签: node.js express mongoose

我有一个删除帖子的快速API端点。我附加了一个mongoose pre-hook,它反过来删除了对class HomeScreen extends StatefulWidget { final ProjectService projectService; const HomeScreen(this.projectService); @override HomeScreenState createState() => new HomeScreenState(); } class HomeScreenState extends State<HomeScreen> { void handleProjectUpdate() { setState(() => {}); } @override Widget build(BuildContext context) { return new Scaffold( body: new ListView( children: widget.projectService.all().map<ListTile>((f) { return new ListTile( title: new Text(f.name), ); }).toList(), ), appBar: new AppBar( actions: <Widget>[ new IconButton( icon: new Icon(Icons.add), onPressed: () => Navigator.pushNamed(context, "/projects/add")) ], ), ); } } 模型的引用和User模型的引用:

Database.database().reference().child("Users").child("Consumer").child((Auth.auth().currentUser?.uid)!).child("Like_Deals_Dish").observeSingleEvent(of: .value) { datasnapshot in



            if datasnapshot.exists() {

                  print("Like Deals - \(datasnapshot)")


            }
            else{

                print("Liked data is not available")
            }


        }

当删除Comment时,此挂钩成功删除了对PostSchema.pre("remove", async function() { await Comment.remove({ _postId: this._id }).exec(); await User.update({ $pull: { _posts: this._id } }).exec(); }); Comment模型的所有引用。但是,当我将用户模型作为回复(User)发回给用户时,我仍然获得对Post的引用。我知道它是一个旧的版本,因为当我手动查询数据库时,我发现实际上删除了res.send(user)引用。

这就是API的样子:

Post

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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