HTTP 缓存控制标头不缓存

问题描述 投票:0回答:1

我有带有 Express 服务器的 Node js。 当我尝试简单的 api 调用时,它会缓存响应,但是当我涉及 cors 时,会发生一些事情并且响应不会缓存。 (我不知道它是否仅来自cors)。

应用程序配置:

const app = express();
app.use(bodyParser.json());
app.use(cors);
app.use(cookieParser());

Cors.ts:

export const allowedOrigins = [baseUrlFE,baseUrlFE2];

function cors(req: Request, res: Response, next: NextFunction) {
  const origin = req.headers.origin as string;
  if (allowedOrigins.includes(origin)) {
    res.setHeader("Access-Control-Allow-Origin", origin);
  }

  res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization,  Cache-Control");

  // Allow requests to include cookies or authentication headers
  res.setHeader("Access-Control-Allow-Credentials", "true");

  next();
}

export default cors;

工作 EP:(对于此请求,我发送 request.mode 作为 no-cors)

app.get("/test", (req, res) => {
  res.header("Cache-Control", "public, max-age=2592000");
  res.send({ urlBE: baseUrlBE, urlFE: baseUrlFE, env: process.env.NODE_ENV });
});

非工作EP是POST请求,涉及路由器和控制器如下:

app.use("/boo", BooRouter);

//in BooRouter.ts
const router = express.Router();
router.post("/ep2", fooController);

//in controller.ts
export const fooController = async (req: Request, res: Response) => {
  try {
    const results = await db.query("DO SOME FETCH FROM DB);
    console.log("request from server");
    res.header("Cache-Control", "public, max-age=2592000");
    res.json(results.rows);
  } catch (error: any) {
    res.status(500).json({
      type: error.name,
      message: error.message,
    });
  }
};

因此,从 BE 的角度来看,很难理解为什么 GET 方法有效而 POST 方法无效。

正如我之前提到的,工作呼叫和非工作呼叫之间的主要区别是 GET 与 POST 以及在工作呼叫中我还发送模式:no-cors,如下所示:

来自 FE(反应)

const response = await fetch(urlBE + url, {
      method,
      credentials: "include",
      //mode: 'no-cors' for working EP , 'cors' didnt works
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${token || ""}`,
        // "Cache-Control": "public, max-age=2592000",
      },
      body: BODY,
    });
express http cors browser-cache cache-control
1个回答
0
投票

你忘了,打电话给cors,你可以这样做

const app = express();
app.use(bodyParser.json());
app.use(cors());
app.use(cookieParser());
© www.soinside.com 2019 - 2024. All rights reserved.