尝试在 Nodejs 和 MongoDB 中获取当前登录的用户任务

Posted

技术标签:

【中文标题】尝试在 Nodejs 和 MongoDB 中获取当前登录的用户任务【英文标题】:Trying to get current logged in user tasks in Nodejs and MongoDB 【发布时间】:2021-01-06 06:22:56 【问题描述】:

我正在开发一个项目,使管理员能够将任务分配给不同的用户,每个用户应该只能看到自己的任务。

我尝试通过使用 user.id 作为密钥来做到这一点,当用户登录时我们发送一个令牌,并且该令牌包括 user_id 和其他用户信息,我试图从该令牌中提取 id 并查看基于此的任务。

任务模型

const TaksSchema = new Schema(
  user: 
    type: mongoose.Schema.Types.ObjectId,
    ref: 'users',
  ,
  taskName: 
    name: String,
  ,
  taskDesc: 
    name: String,
  ,
  dateAssigned: 
    type: Date,
    default: Date.now,
  ,
  requiredDate: 
    type: Date,
  ,
  completed:  type: Boolean, default: false ,
);

// Export Schema
module.exports = Tasks = mongoose.model('tasks', TaksSchema); 

用户模型

const UserSchema = new Schema(
  name: 
    type: String,
    required: true,
  ,
  email: 
    type: String,
    required: true,
  ,
  password: 
    type: String,
    required: true,
  ,
  role: 
    type: String,
    enum: ['basic', 'admin'],
    default: 'basic',
  ,
  avatar: 
    type: String,
  ,
  date: 
    type: Date,
    default: Date.now,
  ,
);

// Export Schema
module.exports = User = mongoose.model('users', UserSchema);

任务路线

router.get('/', (req, res) => 
  const errors = ;
  Tasks.findOne( user: req.user.id )
    .populate('user', ['name', 'avatar'])
    .then((task) => 
      if (!task) 
        errors.notask = "There's no Tasks Right Now";
        return res.status(400).json(errors);
      
      res.json(task).catch((err) => res.status(404).json(err));
    );
);

当我尝试从邮递员发送获取请求时,我收到此错误

TypeError: 无法读取未定义的属性“id”

为了安全起见,我通过 JWT 令牌发送 Id。 这是代码

const payload =  id: user.id, name: user.name, avatar: user.avatar ; // Create jwt patload
        // Sign the token
        jwt.sign(
          payload,
          keys.secretOrKey,
           expiresIn: 3600 ,
          (err, token) => 
            res.json( sucess: true, token: 'Bearer ' + token );
          
        );

【问题讨论】:

您是否使用verify 在某个中间件中解码jwt?如果是这样,您可以将该代码添加到您的问题中 【参考方案1】:

您必须先验证/解码 ID 才能接收有效负载。

在代码中,您尝试从user 访问id 字段。实际上,您需要添加一个中间件来验证 JWT 并将结果附加到 user 字段中。

例子:

中间件/validateJwt.js

假设您在标头中将 JWT 作为不记名令牌发送。

 try

 let token = req.headers.authorization.split(" ")[1]; // Bearer <token>
 let result = jwt.verify(token, "JWT_SECRET", options);
 req.user = result;
 next();
 catch...

【讨论】:

【参考方案2】:

您的 API 应如下所示

GET /api//users/:id

在这种情况下你可以使用

req.params.id

作为第一个参数。

【讨论】:

我通过 JWT 令牌发送 ID 和所有用户信息和有效负载。【参考方案3】:

Pranesh A S 的回答应该能让你继续前进。为了完成他的建议,如果您将中间件 validateJWT.js 存储为

const jwt = require("jsonwebtoken");

module.exports = function (req, res, next) 
  const token = req.header("x-auth-token");
  if (!token) 
    res.status(401).json( msg: "NO token. Auth Failed" );
  
  try 
    console.log(token);
    const decoded = jwt.verify(token, "Secret key");
    req.user = decoded.user;
    next();
   catch (err) 
    console.log(err);
    res.status(401).json( msg: "Token is not valid" );
  
;

将其导入您的 App.js 文件并在定义路由时,

使用

const validateJWT =require ("./middleware/validateJWT")

app.get("/", validateJWT, (req, res)=>
// do stuff
)

【讨论】:

以上是关于尝试在 Nodejs 和 MongoDB 中获取当前登录的用户任务的主要内容,如果未能解决你的问题,请参考以下文章

连接到 api nodeJS 和 mongoDB

搜索数组 MongoDB NodeJS

NodeJS 和 MongoDB - 根据 id 数组获取对象

NodeJS:将 JSON 保存到 MongoDB

使用 nodejs 和 chartjs 从 mongodb 插入和获取值

使用日期从 mongodb-nodejs 驱动程序获取文档