尝试在 Nodejs 和 MongoDB 中获取当前登录的用户任务
Trying to get current logged in user tasks in Nodejs and MongoDB
我正在做一个项目,使管理员能够将任务分配给不同的用户,每个用户应该只能看到他自己的任务。
我尝试通过使用 user.id 作为键来做到这一点,当用户登录时我们发送一个令牌,并且该令牌包括 user_id 和其他用户信息,我正在尝试从该令牌中提取 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));
});
});
当我尝试从邮递员发送 get 请求时出现此错误
TypeError: Cannot read property 'id' of undefined
为了安全起见,我通过 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 });
}
);
你的API应该看起来像
GET /api//users/:id
在那种情况下你可以使用
req.params.id
作为第一个参数。
您必须先 verify/decode ID 才能接收负载。
在代码中,您试图从 user
访问 id
字段。实际上,您需要添加一个中间件来验证 JWT 并将结果附加到 user
字段中。
示例:
middlewares/validateJwt.js
假设您在 header 中发送 JWT 作为 Bearer Token。
try{
let token = req.headers.authorization.split(" ")[1]; // Bearer <token>
let result = jwt.verify(token, "JWT_SECRET", options);
req.user = result;
next();
} catch...
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
})
我正在做一个项目,使管理员能够将任务分配给不同的用户,每个用户应该只能看到他自己的任务。
我尝试通过使用 user.id 作为键来做到这一点,当用户登录时我们发送一个令牌,并且该令牌包括 user_id 和其他用户信息,我正在尝试从该令牌中提取 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));
});
});
当我尝试从邮递员发送 get 请求时出现此错误
TypeError: Cannot read property 'id' of undefined
为了安全起见,我通过 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 });
}
);
你的API应该看起来像
GET /api//users/:id
在那种情况下你可以使用
req.params.id
作为第一个参数。
您必须先 verify/decode ID 才能接收负载。
在代码中,您试图从 user
访问 id
字段。实际上,您需要添加一个中间件来验证 JWT 并将结果附加到 user
字段中。
示例:
middlewares/validateJwt.js
假设您在 header 中发送 JWT 作为 Bearer Token。
try{
let token = req.headers.authorization.split(" ")[1]; // Bearer <token>
let result = jwt.verify(token, "JWT_SECRET", options);
req.user = result;
next();
} catch...
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
})