Я создаю приложение с Angular и Nest JS, используя NGXS для управления состоянием. Я настроил все, обслужил свое приложение и получил эту ошибку в консоли.
Доступ к XMLHttpRequest по адресу "localhost: 333 / api / product-index" из источника "http://localhost : 4200 'было заблокировано политикой CORS: Запросы между источниками поддерживаются только для схем протоколов: http, data, chrome, chrome -extension, https.
После выполнения небольшое исследование, которое я обнаружил в этой статье , объясняющее, как обрабатывать CORS в наших Angular приложениях, и после проверки файлов, которые он говорит нам изменить, я увидел, что настройки уже присутствовали. Я был озадачен файлом server.js
, который он нам предлагал обновить, и после изучения того, что обычно делается в файле server.js
, я пришел к выводу, что в Angular это должен быть файл main.ts
, однако я не знать, нужно ли мне вносить изменения в файл main.ts
в моем приложении Nest или в мое приложение Angular. Я также использую nrwl nx
monorepo для своих приложений.
Это файл proxy.conf.json
из моего angular приложения
{
"/cre8or-maker-backend": {
"target": "http://localhost:3333",
"secure": false,
"logLevel": "debug"
}
}
Это объект serve
объекта architect
в моем файле angular.json
.
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "cre8or-maker:build",
"proxyConfig": "apps/cre8or-maker/proxy.conf.json"
}
Как я уже говорил, эти настройки уже присутствовали в этих файлах, и единственное, что мне кажется новым, - это часть об изменении * Файл 1029 *, который я предполагаю, является файлом main.ts
в мире Angular. Вот как выглядят мои main.ts
файлы
nest main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app/app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const globalPrefix = 'api';
app.setGlobalPrefix(globalPrefix);
const port = process.env.port || 3333;
await app.listen(port, () => {
console.log('Listening at http://localhost:' + port + '/' + globalPrefix);
});
}
bootstrap();
angular main.ts
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => console.error(err));
Я уже установил пакет cors
npm Я просто не знаю, что еще я должен сделать, чтобы заставить это работать, кто-нибудь может помочь?
ОБНОВЛЕНИЕ Я пытался добавить app.enableCors();
к файл main.ts
в моем приложении Nest Js, а также изменение функции create(AppModule)
на create(AppModule, {cors: true})
, и ни одна из них не решает проблему. Я также добавил следующий фрагмент кода, который тоже не помог.
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Accept');
next();
});
На данный момент у меня определено только одно состояние, передающее запрос API на серверную часть. Внутри моего состояния у меня есть действие, которое выглядит следующим образом:
@Action(GetProductIndexList)
getProductIndexListData({patchState, dispatch, getState}: StateContext<ProductIndexListModel>){
return this.dataService.fetchProductIndexList().pipe(tap((result)=>{
const state = getState();
patchState({items:[...state.items, ...result]});
}));
}
Я выполняю вызов API внутри служебного файла, который я вызываю dataService
в конструкторе состояния. Служебный файл выглядит следующим образом.
@Injectable({ providedIn: 'root' })
export class ProductIndexService{
constructor(private httpClient: HttpClient){}
private readonly URL: string = 'localhost:3333/api';
public fetchProductIndexList():Observable<CattegoryIndexItem[]>{
const path: string = this.URL + '/product-index';
return this.httpClient.get(path) as Observable<CattegoryIndexItem[]>;
}
}
В Nest JS я могу успешно вызывать данные без каких-либо ошибок, поэтому я знаю, что контроллеры настроены правильно, но если кто-то захочет посмотреть, как у меня настроены вещи там, дайте мне знать, и я обновлю этот вопрос с кодом.