我正在构建一个小计算器应用程序来学习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!
3条答案
按热度按时间yb3bgrhw1#
要从前端本地访问它,您必须更改启用了main.ts的CORS设置。
起始
字符串
至
型
Main.ts
型
为了正确地处理它,我们可以根据环境设置保持此设置,以使此产品代码可用。CORS设置也可以保存在托管服务上的应用程序配置中。
型
来自angular应用localhost的工作请求:http://localhost:4200
Working request from the angular app local host
hec6srdp2#
请确保您尝试访问的URL在开始时具有
http://
或https://
。jw5wzhpr3#
我还要在这里补充一点,
opcode.service.ts
中的额外头文件是不必要的。这个解释和类比是Omar在我的GitHub上给出的。我将再次使仓库私有化,所以我也将它粘贴在这里:答案
头部Access-Control-Allow-Origin和allow-origin应该在服务器端而不是客户端配置。
想象一下,你是酒吧的保镖,你有一个政策,只允许从特定地址的人进入。现在,想象一下这样一个场景:一位顾客走近酒吧,要求你让他们进来。它们向您显示他们的标识(握手头),其中包括一个请求条目的注解(此注解表示客户端提供的在该方法中的头)。然而,作为保镖,你明白最终是酒吧决定谁能进入,而不是顾客
我建议你,如果你需要为你正在进行的每一个调用使用头,寻找一个
Interceptor
,如果不是,越简单越好。如果需要发送x-www-form-urlencoded调用,可以在需要时发送FormData对象。就像这样:
字符串