angularjs Nest.js/Angular-CORS已启用,但在发出请求时仍收到CORS错误

xzv2uavs  于 2023-08-02  发布在  Angular
关注(0)|答案(3)|浏览(135)

我正在构建一个小计算器应用程序来学习Nest.js和Angular。我已经建立了一个服务器,它托管了一个简单的Web API,有几个端点,其中一个端点返回后端当前支持的所有操作码的列表。我试图获取(在init上)并使用此列表来填充前端的下拉选择器。

前端

calculator-app/src/app/calculator-form/保存使用请求的表单组件。它所做的就是调用OpcodeService.getSupportedOpcodes()并记录结果。在这一点上,我知道我需要对result对象做更多的工作,但是由于CORS错误,我还没有做到这一步。

import { Component } from '@angular/core';
import { OpcodeService } from '../services/opcode.service';

@Component({
  selector: 'app-calculator-form',
  templateUrl: './calculator-form.component.html',
  styleUrls: ['./calculator-form.component.scss'],
  providers: [ OpcodeService ]
})
export class CalculatorFormComponent {
  supportedOpcodes: string[] = ['?']

  constructor(private opcodeService: OpcodeService) {}

  ngOnInit() {
    this.opcodeService.getListOfSupportedOpcodes().subscribe(res => {
      console.log(res);
    })
  }
}

字符串
calculator-app/src/app/services/opcode.service.ts发出实际的HTTP请求。当我使用Postman进行测试时,这个端点可以按预期工作,并且我尽了最大努力来模拟使用Postman的头。这也是相当简单的,但可能我在这里遗漏了一些配置。

import { Injectable } from '@angular/core';
import { Enviornment } from '../enviornment';
import { HttpClient, HttpHeaders } from '@angular/common/http';

@Injectable({
  // declares that this service should be created
  // by the root application injector.
  providedIn: 'root'
})
export class OpcodeService {
  supportedOpcodes: string[] = [];

  constructor(private http: HttpClient) {}

  getListOfSupportedOpcodes() {
    const headers = new HttpHeaders()
      .set('content-type', 'application/x-www-form-urlencoded')
      .set('Access-Control-Allow-Origin', '*');
    
    return this.http.get(Enviornment.serverUrl + "/opcode", {'headers':  headers});
  }
}

后台

我有理由相信我的路由没有问题。如上所述,我能够看到GET -> localhost:3000/opcode返回的值。下面是我的main.ts文件,带有enableCors()配置对象。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors({
    allowedHeaders: ['content-type'],
    origin: 'http://localhost:4200/'
  });
  await app.listen(3000);
}

bootstrap().then(function() {
  console.log("\nReady for maths!");
});


Screen capture of CORS error in Chrome
我已经尝试使用允许的头启用CORS。我知道Nest.js在默认情况下解析form-data有问题,所以我尝试设置GET请求的头部。已尝试在this post之后设置原点。
Here is the full repository. Feel free to open issues with any other feedback!

yb3bgrhw

yb3bgrhw1#

要从前端本地访问它,您必须更改启用了main.ts的CORS设置。
起始

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

字符串

app.enableCors(); //without any configuration option.


Main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
 const app = await NestFactory.create(AppModule);
 app.enableCors();
 await app.listen(3000);
}

 bootstrap().then(function() {
 console.log("\nReady for maths!");
});


为了正确地处理它,我们可以根据环境设置保持此设置,以使此产品代码可用。CORS设置也可以保存在托管服务上的应用程序配置中。

if (process.env.ENV === 'development' && process.env.LOCAL_ENV === 
'enabled') {
  app.enableCors();
 }


来自angular应用localhost的工作请求:http://localhost:4200
Working request from the angular app local host

hec6srdp

hec6srdp2#

请确保您尝试访问的URL在开始时具有http://https://

jw5wzhpr

jw5wzhpr3#

我还要在这里补充一点,opcode.service.ts中的额外头文件是不必要的。这个解释和类比是Omar在我的GitHub上给出的。我将再次使仓库私有化,所以我也将它粘贴在这里:

答案

头部Access-Control-Allow-Origin和allow-origin应该在服务器端而不是客户端配置。
想象一下,你是酒吧的保镖,你有一个政策,只允许从特定地址的人进入。现在,想象一下这样一个场景:一位顾客走近酒吧,要求你让他们进来。它们向您显示他们的标识(握手头),其中包括一个请求条目的注解(此注解表示客户端提供的在该方法中的头)。然而,作为保镖,你明白最终是酒吧决定谁能进入,而不是顾客
我建议你,如果你需要为你正在进行的每一个调用使用头,寻找一个Interceptor,如果不是,越简单越好。
如果需要发送x-www-form-urlencoded调用,可以在需要时发送FormData对象。就像这样:

let formData = new FormData();
formData.append('parameter', 'value');
return this.http.post(URL, formData);

字符串

相关问题