heroku 部署后在staging服务器上命中Algolia Browse API时Angular中的CORS问题

fcy6dtqo  于 2023-08-06  发布在  Go
关注(0)|答案(1)|浏览(184)

几天前,我在本地主机上遇到了这个问题,我用proxy.conf.json修复了它。

proxy.config.json:

{
    "/1/indexes": {
    "target": "https://{{myApplicationID}}-dsn.algolia.net",
    "secure": true,
    "changeOrigin": true
    }
}

字符串
在我的服务.ts:

const url: any = `/1/indexes/Product/browse?page=0&hitsPerPage=20`;
this.httpClient.get(url,{
      headers: {
        'X-Algolia-Api-Key': `${this.algoliaApplicationKeyForBrowse}`,
        'X-Algolia-Application-Id': `${this.algoliaApplicationID}`,
      },
    });


在localhost上运行良好。
但现在的问题是,我已经将此应用程序部署到Heroku上的临时服务器上,但此代理在那里无法工作。

/1/indexes/Product/browse?page=0&hitsPerPage=20返回我的应用主页,而不是访问Algolia服务器。

Heroku上构建并部署应用程序后,是否可以使用相同的proxy.conf.json
我尝试在build下的angular.json中添加proxy.conf.json,但无法正常工作。

5hcedyr0

5hcedyr01#

在Heroku上,您不能使用proxy.conf.json方法来代理对Algolia或任何其他外部API的请求。proxy.conf.json仅用于ng serve的本地开发。
要使其在Heroku上工作,您需要在后端服务器上设置代理(在Heroku上运行)。后端服务器会将请求转发给Algolia,并附上必要的头文件,然后将响应返回给你的Angular应用。
以下是步骤的简单概述:
1.在Heroku上设置一个后端服务器(例如,使用Express的Node.js)。
1.在后端服务器上创建一个路由来处理到Algolia的代理请求。
1.更新Angular服务,向后端服务器的代理路由发出请求,而不是直接向Algolia发出请求。
1.后端服务器将处理代理并将请求转发到Algolia,添加所需的头。

  1. Algolia的响应将通过后端服务器发送回您的Angular应用程序。
const express = require('express');
const axios = require('axios');

const app = express();

// Define a route to handle proxying requests to Algolia
app.get('/api/proxy/algolia/browse', async (req, res) => {
  try {
    const algoliaUrl = `https://${process.env.ALGOLIA_APPLICATION_ID}-dsn.algolia.net/1/indexes/Product/browse`;
    const response = await axios.get(algoliaUrl, {
      headers: {
        'X-Algolia-Api-Key': process.env.ALGOLIA_API_KEY,
        'X-Algolia-Application-Id': process.env.ALGOLIA_APPLICATION_ID,
      },
    });

    res.send(response.data);
  } catch (error) {
    res.status(error.response ? error.response.status : 500).send(error.message);
  }
});

// Other routes and server configurations...

const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

字符串
Angular Service(API.service.ts):

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root',
})
export class ApiService {
  constructor(private http: HttpClient) {}

  fetchDataFromAlgolia() {
    // Update the URL to target your backend server's proxy route
    const url = '/api/proxy/algolia/browse?page=0&hitsPerPage=20';

    // Make the HTTP request to your backend server
    return this.http.get(url);
  }
}


Angular Component(dashboard.component.ts):

import { Component } from '@angular/core';
import { ApiService } from './api.service';

@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
  constructor(private apiService: ApiService) {}

  fetchAlgoliaData() {
    this.apiService.fetchDataFromAlgolia().subscribe((data) => {
      // Handle the response data from Algolia here
      console.log(data);
    });
  }
}


请注意,这是一个简化的示例,实际的实现将取决于您的后端服务器技术和设置。确保在Heroku服务器上配置环境变量(e.g., ALGOLIA_API_KEY and ALGOLIA_APPLICATION_ID),以确保敏感数据的安全。
这样,您就可以在Heroku上安全地代理请求到Algolia,而不依赖于proxy.conf.json

相关问题