Node.js 如何从用户在mongoDB中发布的帖子中获取用户信息

Node.js 如何从用户在mongoDB中发布的帖子中获取用户信息,node.js,mongodb,express,Node.js,Mongodb,Express,我有一个用户模型和一个帖子模型。现在,只有登录的用户才能创建新帖子。现在,当文章提交时,我想获得文章信息以及用户信息。如果你看到了,我用过 userId:{type:Schema.Types.ObjectId,ref:“User”}引用用户模型 比如,在API tester Postman中,我应该输入什么作为主体 { “标题”:“abcd”, “说明”:“efgh”, //应该自动生成userId还是我必须在这里输入 } 我知道slug是自动生成的,但是用户信息呢?我在这里感到困惑? 如何从

我有一个用户模型和一个帖子模型。现在,只有登录的用户才能创建新帖子。现在,当文章提交时,我想获得文章信息以及用户信息。如果你看到了,我用过

userId:{type:Schema.Types.ObjectId,ref:“User”}
引用用户模型

比如,在API tester Postman中,我应该输入什么作为主体

{
“标题”:“abcd”,
“说明”:“efgh”,
//应该自动生成userId还是我必须在这里输入
}
我知道slug是自动生成的,但是用户信息呢?我在这里感到困惑? 如何从userId获取用户信息?(虽然我有一个路由
/users/:id
,但我不知道在这种情况下如何使用它)

用户模型

const userSchema=新模式({
用户名:{type:String,必需:true},
电子邮件:{type:String,必需:true},
密码:{type:String,必需:true},
},{时间戳:true})
后期模型

const postSchema=新模式({
标题:{type:String,必需:true},
描述:{type:String,必需:true},
userId:{type:Schema.Types.ObjectId,ref:“User”},
slug:{type:String,slug:“title”}
},{时间戳:true}
authmiddleware.js


功能生成器(有效载荷){
返回jwt.符号(有效载荷,“机密”)
}
功能验证令牌(req、res、next){
const token=req.headers.Authorization
if(!token)返回res.json({msg:“unauthorized”})
jwt.verify(令牌,“秘密”,(错误,解码)=>{
if(err)返回res.json({error:“unauthorized”})
req.user=已解码
下一个()
})
}
module.exports={generateToken,verifyToken}
routes/posts.js

router.post(“/new”,authmiddleware.verifyToken,postControllers.newPost)
postControllers/newPost.js

newPost:(请求、回复)=>{
Post.create(请求正文,(err,newPost)=>{
if(err)console.log(err)
如果(!newPost){
返回res.json({消息:“未找到帖子”})
}其他如果(新邮政){
返回res.json({post:newPost})
}
})
}
当我通过输入此信息作为正文(并在标题中发送令牌)来签入邮递员时

{
“标题”:“我的第一篇帖子”,
“描述”:“我的第一篇文章描述”
}
我得到了这个结果:

{
“职务”:{
“_id”:“5e3028ded3e24b55e06baaf2”,
“标题”:“我的第一篇帖子”,
“描述”:“我的第一篇文章描述”
“createdAt”:“2020-01-28512:28:14.331Z”,
“更新日期”:“2020-01-28512:28:14.331Z”,
“鼻涕虫”:“我的第一篇帖子”,
“_v”:0
}
}
但是我也想在这里得到用户信息

Update:因此,我在新创建的post对象中获得了用户ID

我之前是这样做的:

newPost:(请求、回复)=>{
Post.create(req.body,req.user.userId,(err,newPost)=>{
if(err)console.log(err)
如果(!newPost){
返回res.json({消息:“未找到帖子”})
}其他如果(新邮政){
返回res.json({post:newPost})
}
})
}
并且得到和错误:

{
“错误”:{
“消息”:“Document()的参数\“obj\”必须是对象,got 5e2f365d41f66569445eec2”,
“名称”:“ObjectParameterError”
}
}
然后我做了这个我得到了结果:


newPost:(请求、回复)=>{
常数数据={
标题:req.body.title,
描述:req.body.description,
userId:req.user.userId
}
创建(数据,(err,newPost)=>{
if(err)console.log(err)
如果(!newPost){
返回res.json({消息:“未找到帖子”})
}其他如果(新邮政){
返回res.json({post:newPost})
}
})
}

不应该发生这种情况。否?

您可以将登录用户的id放入身份验证中间件中的请求中,并在路由中访问该用户id

假设您有这样一个身份验证中间件:

const jwt=require(“jsonwebtoken”);
module.exports=功能(请求、恢复、下一步){
让代币;
如果(
请求授权&&
请求头、授权、启动和(“持票人”)
) {
token=req.headers.authorization.split(“”[1];
}
如果(!token)返回res.status(401).send(“拒绝访问,未提供令牌”);
试一试{
const decoded=jwt.verify(令牌,“jwt_私钥”);
req.user=已解码;
next();
}捕获(ex){
res.status(400).send(“无效令牌”);
}
};
我假设您以
承载令牌…
的格式在授权标头中发送授权令牌。如果您在不同的标头中发送令牌,则需要相应地调整代码以读取令牌

现在,当您将此中间件应用于路由时,您可以从请求中读取用户id, 并使用它

const Post=require(“../models/Post”);
const auth=require(“../middleware/auth”);
router.post(“/posts”,[auth],异步(req,res)=>{
const result=wait Post.create({
标题:req.body.title,
描述:req.body.description,
user:req.user.\u id//来自auth中间件
});
res.send(结果);
});
要使其工作,您需要在签名时在令牌中包含用户id

const-token=jwt.sign({u-id:user.\u-id},“jwt\u-PRIVATE\u-KEY”);

我相信您可以使用uuid包,并在您的用户模式中生成用户id,当它被创建时,您是否有身份验证中间件来获取登录的用户?是的,我有身份验证中间件。在新的post路由中,我添加了midd