首页 > 解决方案 > TypeError:res.setHeader 不是函数,在启用 cors 时出现此错误

问题描述

I found many similar problems but couldn't resolve this

我的主要目标是从客户端发出 API 请求,通过它我可以将 JSON 文件发送到需要存储在数据库中的服务器,但是由于我的前端和后端托管在不同的域上,我需要启用 Cross -来源资源共享(CORS)。
为了启用 CORS,我使用了使用此处指定的选项配置 CORS的方法( https://stackabuse.com/handling-cors-with-node-js/

这就是我从反应前端发送帖子请求的方式,这里是 apiUrl= http://localhost:${port}/apireact

 fetch(apiUrl, {
              method: 'POST',
              body: JSON.stringify({name: "thunder"}),
            })
              .then(data => console.log(data))
              .catch(err => console.error(err));

代码截图

我的服务器端代码是这样的,

import Koa from "koa";
import next from "next";
import Router from "koa-router";
const cors = require('cors')
const originUrl=process.env.HOST;  //HOST=https://<somenumber>.ngrok.io
const app = next({
  dev,
});
app.prepare().then(async () => {
  const server = new Koa();
  const router = new Router();

/********CORS******************/
const corsOptions = {
  origin: originUrl,
  optionsSuccessStatus: 200, // For legacy browser support
  methods: ['GET','POST']
}

server.use(cors(corsOptions));

router.post("/apireact",(req,res)=>{
    res.json({
      message: 'Hello World2'
    });
});
/**************************/

server.use(router.allowedMethods());
  server.use(router.routes());
  server.listen(port, () => {
    console.log(`> Ready on http://localhost:${port}`);
  });
});

服务器代码截图

在正在运行的服务器上,我收到以下错误,

TypeError: res.setHeader is not a function
┃       at applyHeaders (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:153:15)
┃       at applyHeaders (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:149:11)
┃       at applyHeaders (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:149:11)
┃       at cors (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:187:7)
┃       at C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:224:17
┃       at originCallback (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:214:15)
┃       at C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:219:13
┃       at optionsCallback (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:199:9)
┃       at corsMiddleware (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\cors\lib\index.js:204:7)
┃       at dispatch (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\koa\node_modules\koa-compose\index.js:42:32)
┃       at C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\@shopify\koa-shopify-auth\dist\src\auth\index.js:111:51
┃       at step (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\tslib\tslib.js:133:27)
┃       at Object.next (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\tslib\tslib.js:114:57)
┃       at C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\tslib\tslib.js:107:75
┃       at new Promise (<anonymous>)
┃       at Object.__awaiter (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\tslib\tslib.js:103:16)
┃       at shopifyAuth (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\@shopify\koa-shopify-auth\dist\src\auth\index.js:40:24)
┃       at dispatch (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\koa\node_modules\koa-compose\index.js:42:32)
┃       at C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\koa\node_modules\koa-compose\index.js:34:12
┃       at Application.handleRequest (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\koa\lib\application.js:168:12)
┃       at Server.handleRequest (C:\Users\Kulbhushan goswami\learning_site\my_email_app\node_modules\koa\lib\application.js:150:19)
┃       at Server.emit (events.js:315:20)

请建议我该如何解决这个问题?

标签: node.jsexpress

解决方案


从文档https://github.com/koajs/router/blob/master/API.md中,Koa 路由看起来像

router.get('/', (ctx, next) => {
});

在您的代码中,您将其用作

router.post("/apireact",(req,res)=>{
    res.json({
      message: 'Hello World2'
    });
});

我猜这就是问题所在。


推荐阅读