我有一个删除帖子的快速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并反序列化用户的中间件)
答案 0 :(得分:3)
requireAuth
中,您从数据库获取用户并将其存储在req.user await post.remove();
您从用户中删除了帖子和帖子后引用,一切正常const user = await req.user.save();
- 您正在将旧用户(从1号中获取)保存到数据库。不好。在执行任何其他操作之前,必须更新存储在req.user中的User对象。 req.user仍然存储旧版本的用户。在我看来,而不是
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);
}
}
);