我有一个中间件判断用户是否通过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()块链

无法在我的 node 项目中转让Google Drive v3 API中的所有权

查询嵌套数组中的最后一个元素具有特定值的mongoDB集合中的文档

如何将信号从终端窗口发送到运行在Raspberry Pi上的Puppeteer/Node.js上的webscraper

Express无法发布

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

SvelteKit应用程序立即退出,没有错误

如何修复我的 NodeJS SSE 写入函数以在后续调用中更新 HTML?

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

为什么我的 Cypress Post 请求的请求正文是空的?

如何使用填充在mongoose 上保存新数据

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

为什么我的react 表单不能正常工作?

如果我使用像 express 这样的 node 服务器,是否需要 webpack-dev-server

在 Mongoose 中创建外键关系

Dart 语言比 JavaScript (Node.js) 有什么好处

使用 MongoDB 更新嵌套数组

为什么模块级返回语句在 Node.js 中起作用?

我无法全局安装 nodemon,nodemon无法识别

什么时候应该将函数存储到变量中?