我有一个中间件判断用户是否通过firebase登录.如果firebase无法授权用户,它会发送一条带有403状态码的消息.

这是我的代码:

import { NextFunction, Request, Response } from "express";
import firebase from "../config/firebase/index";

async function authMiddleware(req: Request, res: Response, next: NextFunction) {
  const headerToken = req.headers.authorization;
  if (!headerToken) {
    return res.send({ message: "No token provided" }).status(401);
  }

  if (headerToken && headerToken.split(" ")[0] !== "Bearer") {
    res.send({ message: "Invalid token" }).status(401);
  }

  const token = headerToken.split(" ")[1];

  try {
    await firebase.auth().verifyIdToken(token);
    next();
  } catch (error) {
    res.send({ message: "Could not authorize" }).status(403);
  }
}

export = authMiddleware;

当我向路由发出请求时,会调用这个中间件.我试图发送一个有故障的jwt,得到的回复是message: "Could not authorize",但状态代码是200而不是403.

当我将返回状态代码更改为401时,响应将给出正确的401状态.

我做错了什么?我怎样才能使状态代码为403?(我试过postman 和chrome)

推荐答案

status(403)更新之前,send()方法返回默认状态为200的响应.在发送响应之前,必须使用status()来设置状态:

res.status(403).send({ message: "Could not authorize" });

Node.js相关问答推荐

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

如何更改ejs中的镜像src,以防从OMDB API获取的某些镜像具有src=N/A

获取驱动器文件夹的直接子文件夹时出现问题

在父模式中设置默认值.

Typescript :泛型类又扩展了另一个泛型类

Typescript 正则表达式:过滤器返回空

为什么我不能将 id 发送到后端并通过 findByIdAndRemove() 删除项目?

为什么当我使用waitForSelector时 Puppeteer 导致我的测试套件挂起 30 秒,即使我在页面和浏览器上调用关闭?

Express.js - 监听请求中止

nuxt:在 docker 镜像中找不到

Socket IOFlutter 未连接

为什么 req.params.id 返回 undefined未定义?

如何使用 superagent/supertest 链接 http 调用?

Nodejs 随机免费 tcp 端口

使用 Node.js 和 Express 进行简单的 API 调用

Route.get() 需要回调函数,但得到对象未定义

node.js 示例

使用 Node-sass 缩小 CSS

FireStore 如果不存在则创建一个文档

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