了解了Nodejs中微服务的概念,我设置了两个微服务authusers,它们都是独立的,并且运行在不同的端口上.

身份验证服务处理用户创建,并使用用户名和密码登录用户.这是意料之中的事.我已经使用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);
  }
});

我没有从类似的帖子中找到任何线索,比如ABC

我不确定什么是不对的.我将感谢可能的建议和解决方案.

推荐答案

console.log(process.env.JWT_SEC)

身份验证过程失败,因此用户属性在req对象上未设置,因此req.usernull.

Node.js相关问答推荐

使用Moongose处理node.js中重定向的then()块链

monorepo内的NPM包使用不在注册表中的本地包

对接Nestjs/VueJS应用程序

Mongoose-不会更新数组中的属性值

仅在 vue 脚本未退出的情况下使用 docker 时出现错误

Indexeddb 获取所有不同于特定值的记录

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

firebase/messaging 不提供名为 getToken 的导出

nvm / node / npm: node 12 的 npm 比 node 14 的更新?

与 NPM 一起安装时找不到 Express 模块

如何在 AWS 上的 Amazon Linux AMI 中自动启动 node.js 应用程序?

错误:大多数中间件(如 bodyParser)不再与 Express Bundle

具有多个条件的mongoose 查找

从目录 node Js 中检索文件

如何运行用 TypeScript 编写的 Mocha 测试?

npm package.json 操作系统特定脚本

__dirname 未在 Node 14 版本中定义

Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

如何断言不为空?

AWS Lambda:如何将秘密存储到外部 API?