我想要做的是一个todo应用程序,您可以在其中创建用户并使用该用户登录。每个用户都可以单个待办事项进行CRUD,并且可以获取链接到该特定用户的所有待办事项。 这是userSchema的架构
const userSchema = new Schema({
firstName:{type:String,trim:true},
lastName:{type:String,trim:true},
userName:{type:String,required:true,unique:true,sparse:true,trim:true},
email:{type:String,required:true,unique:true,sparse:true,trim:true},
phoneNumber:{type:String,unique:true,sparse:true,required:true},
hash:{type:String,required:true}
})
我有todoSchema
author:{type: Schema.Types.ObjectId},
title:{type:String, required:true, trim:true},
context:{type:String, trim:true,},
isFinished:{type:Boolean,required:true,default: false},
finishedAt:{type:Date}
我也有与JWT一起使用的登录系统,我的问题是如何使用当前登录的用户的id保存待办事项。以及如何获取链接到用户的所有待办事项目前已登录 我不希望todos作为数组存储在userSchema中,而是作为不同的模式,您可以为每个todo执行CRUD - 我正在阅读一些名为populate的东西,它带有猫鼬,但我不知道如何实现它 - 如果你能给我一些想法怎么做,那将是非常好的..我不需要全面实施..谢谢你
- 如果您需要更多代码,请https://github.com/jkuzmanovik/todoApi
答案 0 :(得分:1)
一旦用户登录(我猜您使用的是护照),护照就会创建req.user。 req.user将包含创建护照插件时用户模式中给出的所有详细信息。
这可用于填充您的toDo架构,如下所示:
在你要求的get请求中
toDo.find({})
.populate('author')
...
但如果你的目标是找到用户的所有toDos,你可以按照以下方式进行操作
toDo.find({author:req.user._id})
只有在身份验证之后才能执行此操作。 这将为您提供用户的所有待办事项。
PS:一旦你只填充作者字段将被用户对象本身替换(不是正确的单词,但可以理解),它对过滤没有帮助。应该谨慎使用Mongoose人口,因为数据库资源很耗,并且会降低服务器性能。
关于JWT,无论何时进行req,都需要将JWT传递给服务器(通过URL,授权标头等)。有一种名为extract的方法,它将从JWT令牌中提取用户,因此可以进行身份验证。 有关passport-jwt和jsonwebtoken的阅读文档的更多信息。