我有带有 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,
});
你忘了,打电话给cors,你可以这样做
const app = express();
app.use(bodyParser.json());
app.use(cors());
app.use(cookieParser());