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

问题描述

我正在做一个项目,让管理员可以将任务分配给不同的用户,每个用户都应该只看到自己的任务。

我尝试通过使用 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,password: {
    type: String,role: {
    type: String,enum: ['basic','admin'],default: 'basic',avatar: {
    type: String,date: {
    type: Date,});

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

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

类型错误:无法读取未定义的属性“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 });
          }
        );

解决方法

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

在代码中,您尝试从 id 访问 user 字段。实际上,您需要添加一个中间件来验证 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...

,

您的 API 应该看起来像

GET /api//users/:id

在这种情况下,您可以使用

req.params.id

作为第一个参数。

,

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