了解了Nodejs中微服务的概念,我设置了两个微服务auth和users,它们都是独立的,并且运行在不同的端口上.
身份验证服务处理用户创建,并使用用户名和密码登录用户.这是意料之中的事.我已经使用jwt生成了令牌.我可以轻松创建用户、创建会话令牌并验证其有效性.
我的第二个服务是users,我打算用它向用户表示问候并获取用户的详细信息.我需要使用身份验证服务来了解用户何时登录此设置.
然而,在我当前的工作中,当我试图使用有效的用户id和在标题中传递的有效令牌转到端点/users/:id/sayhello
时,我会出现以下错误:
TypeError: Cannot read properties of undefined (reading 'id') at /path/auth/verifyToken.js:23:21
.
然后是这个;来自jwt:
{
"name": "JsonWebTokenError",
"message": "secret or public key must be provided"
}
现在让我们看看我的设置.
这是我在auth服务中的verifyToken.js个文件:
const verifyToken = (req, res, next)=>{
const authHeader = req.headers.token
// split the header, and get the token "Bearer token"
const token = authHeader.split(" ")[1];
if (authHeader) {
jwt.verify(token, process.env.JWT_SEC, (err, user)=>{
if (err) res.status(403).json(err);
req.user = user
next();
})
} else {
return res.status(401).json("You are not authenticated")
}
}
const verifyTokenAndAuthorization = (req, res, next) =>{
verifyToken(req, res, ()=>{
if(req.user.id === req.params.id){ // error traced back to this line
next();
}else{
res.status(403).json("Permission denied!");
}
})
}
在我的users服务中,下面是使用auth服务来知道用户何时登录然后打招呼的代码.
app.get("/users/:id/sayhello", verifyTokenAndAuthorization, async (req, res) => {
try {
const user = await User.findById(req.params.id);
console.log(req.params.id) // undefined
res.status(200).json(`Hello ${user.username}`);
} catch (error) {
res.status(500).json(error);
}
});
我不确定什么是不对的.我将感谢可能的建议和解决方案.