【问题标题】:Nest.js is giving cors error even when cors is enabled即使启用了 cors,Nest.js 也会给出 cors 错误
【发布时间】:2023-07-30 19:38:01
【问题描述】:

我正在开发一个以nest.js 作为后端的next.js 应用程序。现在,即使我在我的 Nest.js 的 main.ts 文件中启用了 cors,我也遇到了 cors 错误。

这是我的 main.ts 文件。


    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import cookieParser from 'cookie-parser';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      if (process.env.APP_ENV !== 'production') {
        app.enableCors({
          allowedHeaders: '*',
          origin: '*',
          credentials: true,
        });
      } else {
        app.enableCors({
          origin: process.env.FE_URL,
          credentials: true,
        });
      }
    
      app.use(cookieParser());
      await app.listen(process.env.PORT || 5000);
    }
    bootstrap();

我也尝试了以下方法。


    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import cookieParser from 'cookie-parser';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      
      app.enableCors({
        allowedHeaders: '*',
        origin: '*',
        credentials: true,
      });
    
      app.use(cookieParser());
      await app.listen(process.env.PORT || 5000);
    }
    bootstrap();

我也试过了


    app.enableCors({
      origin: 'http://localhost:3000',
      credentials: true,
    });

现在,从_app.js 的前端,我正在定义 Axios 全局配置,如下所示。


    axios.defaults.baseURL = 'http://localhost:5000';
    axios.defaults.withCredentials = true;

然后在我的login.tsx 文件中,我将请求发送到nest.js 应用程序,如下所示。


    const {data } = await axios.post('/auth/login', values);

这里的 values 是一个有用户名和密码的对象。

这是错误。

我还尝试了其他 * 问题的所有其他解决方案。但他们都没有解决我的问题。它实际上在几天前工作。我不知道发生了什么。

我在这里做错了什么?现在它一直在驱使我。如果需要,我可以提供更多代码。

【问题讨论】:

  • @jub0bs 我也尝试像origin: http://localhost:3000 一样写它。还是不行。
  • 您正在使用通配符 (*),不仅用于来源,还用于标题。正如我在上面链接到的 MDN Web Docs 中所解释的,这不能与凭证请求一起使用。相反,请尝试allowedHeaders: ['content-type']
  • 实际的错误信息是什么?有不同类型的 CORS 错误。
  • @derpirscher 查看截图。

标签: typescript cors nestjs


【解决方案1】:

正如MDN Web Docs about CORS 中所述,您不能将通配符 (*) 与凭据请求一起使用,无论是允许来源还是请求标头(或请求方法)。 Fetch standard 是一个更权威但可能更枯燥的来源:

对于Access-Control-Expose-HeadersAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 响应标头,值* 算作没有凭据的请求的通配符。对于此类请求,无法单独匹配 * 的标头名称或方法。

因此,而不是

app.enableCors({
  allowedHeaders: '*',
  origin: '*',
  credentials: true,
});

您应该完全避免使用通配符并明确指定允许的来源和允许的请求标头,如下所示:

app.enableCors({
  allowedHeaders: ['content-type'],
  origin: 'http://localhost:3000',
  credentials: true,
});

【讨论】:

  • Cors 错误已解决。但是现在我收到了一个 404 not found 错误,考虑到它几天前就起作用了,这更奇怪
  • @Pranta 我不希望 404 与您之前的 CORS 问题有关。如果您自己找不到解决方案,您可能应该提出一个单独的问题。
【解决方案2】:

就我而言,我遵循了official docs,上面写着在nestjs上启用CORS

const app = await NestFactory.create(AppModule);
app.enableCors();
await app.listen(3000);

但由于我很久以前安装的 CORS 插件,我仍然收到 CORS 错误。

所以我在浏览器中关闭了“允许 CORS”插件,错误就消失了。 (如果您有任何类似的插件,请将其关闭,看看它是否适合您。)

【讨论】:

  • 如果您没有发现此答案有帮助,请在此处提及原因或在此处提及您的问题与我的答案,以便我改进我的答案!