尝试使用 Node.js 和 Fastify 提取请求中的用户数据时出现问题

Problem when trying to extract user data in a request with Node.js and Fastify

提问人:Pedro Schinke 提问时间:11/14/2023 更新时间:11/14/2023 访问量:14

问:

我正在编写一个饮食控制代码,我想对用户进行身份验证,以便他们只能访问他们注册的膳食。首先,我尝试注册第一餐,但我只得到“禁止”,因为userId返回undefined

代码如下:

interface UserPayload {
  userId: string
}

interface CustomRequest extends FastifyRequest {
  user?: UserPayload
}

export async function mealsRoutes(app: FastifyInstance) {
app.addHook(
    'onRequest',
    async (request: CustomRequest, reply: FastifyReply) => {
      const authHeader = request.headers.authorization
      const token = authHeader && authHeader.split(' ')[1]

  if (!token) {
    reply.code(401).send({
      error: 'Unauthorized',
    })
    return
  }

  try {
    const decoded = jwt.verify(token, env.JWT_SECRET) as UserPayload

    request.user = decoded
  } catch (err) {
    reply.status(403).send({
      error: 'Forbidden',
    })
  }
}
)

app.post('/', async (request: CustomRequest, reply) => {
const createMealBodySchema = z.object({
  title: z.string(),
  description: z.string(),
  hourOfMeal: z.number().min(0).max(23),
  minuteOfMeal: z.number().min(0).max(59),
  onDiet: z.enum(['Sim', 'Não']),
})

const userId = request.user?.userId

console.log(userId) //undefined

if (!userId) {
  return reply.status(403).send({
    error: 'Forbidden',
  })
}

const { title, description, hourOfMeal, minuteOfMeal, onDiet } =
  createMealBodySchema.parse(request.body)

await knex('meals').insert({
  id: randomUUID(),
  title,
  description,
  hourOfMeal,
  minuteOfMeal,
  onDiet,
  userId,
})

return reply
  .status(201)
  .send({ message: 'Success!' })
})

如何解决此问题,以便它返回用户 ID,并且可以将其添加到餐食中?

节点.js 打字稿 JWT 请求 fastify

评论


答: 暂无答案