我开发了一个带有express后端的angular 7应用程序。Express运行在localhost:3000
上,angular客户端运行在localhost:4200上。
在server.js
我有(不是整个代码)
const app = express();
// Enable CORS
app.use(cors());
// Get our API routes
const api = require('./api');
// Set our api routes
app.use('/api', api);
app.use(express.static(__dirname + '/dist/sfdc-event'));
在api.js文件中,我有router.get('/oauth2/login'),它重定向到https://example.com,https://example.com发送访问令牌并对用户进行身份验证(OAuth2身份验证)。
当我调用url http://localhost:3000/api/oauth2/login时,一切都很正常,但是当我试图从angular component.ts -> service.ts执行相同操作时,我得到以下错误。
阻止的跨域请求:同源策略不允许阅读远程资源原因:缺少CORS标头“Access-Control-Allow-Origin”
Angularapp的流程如下:login.component.ts,它有一个按钮调用服务API.service.ts,后者执行一个httpget
login.component.ts
sfdcLogin(): void {
console.log('DEBUG: LoginComponent: ', 'Login button clicked..');
this.apiService.login().subscribe( data => { console.log( data ); });
}
api.service.ts
login() {
console.log('DEBUG: APiService login(): ', 'login() function.');
const URL = 'oauth2/login';
console.log('DEBUG: ApiService login URL : ', `${environment.baseUrl}/${URL}`.toString());
return this.http.get(`${environment.baseUrl}/${URL}`)
.pipe( map( res => res ));
}
有人能帮我解决这个错误吗?我有a)CORS B)从server.js提供静态文件作为
app.use(express.static(__dirname + '/dist/sfdc-event'));
c)动态环境变量。我还错过了什么?
9条答案
按热度按时间bfhwhh0e1#
如果这只是为了开发,我建议使用angular-cli附带的代理。创建名为proxy.json的文件
和/或
以及调用
ng serve --proxy-config proxy.json
。如果你认为这在生产中仍然是一个问题,那么我们必须进行更大的对话。完整文档:https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md
什么是CORS:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
vhipe2zx2#
对于Angular 7,您必须执行其他实现。从angular文档中,您必须创建一个proxy.js文件:
https://angular.io/guide/build#using-corporate-proxy
编辑您自己的后端服务器的路径。
proxy.js:
稍后将其添加到package.json
并将其调用为:
在你的app.js中,只需简单地添加:
我也遇到了同样的问题,这解决了我的问题。我希望它有帮助!
wlsrxk513#
要将
http://localhost:4200/api
的所有调用转移到在http://localhost:3000/api
上运行的服务器,请执行以下步骤。1.在
package.json
旁边的项目src/
文件夹中创建一个文件proxy.conf.json
。1.将以下内容添加到新代理文件中:
1.在CLI配置文件angular.json中,将proxyConfig选项添加到serve目标:
1.要使用此代理配置运行开发服务器,请调用
ng serve
。pcrecxhr4#
我改变了回调机制来解决CORS问题,我利用OAuth流让用户从重定向到https://example.com/auth/callback的https://example.com进行身份验证,我从http://localhost:4200发起请求,然后将回调URL发送到服务器http://localhost:3000,我得到了CORS错误。
现在,我将其重定向到客户端http://localhost:4200,并解决了CORS问题。所有其他对GET、POST、DELETE、PATCH的调用都来自工作正常的http://localhost:3000。
谢谢大家的意见。
gc0ot86w5#
我一直在服务器端使用Angular cli和**.net Framework**。
为了解决这个问题,我只是使用以下步骤在服务器端启用CORS交互:
Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.2.6
然后,在WebApiConfig类中:
1.添加
using System.Web.Http.Cors;
或
uoifb46i6#
默认情况下,Angular设置了一些请求头参数,其中一个是'Content-Type',其默认值是'application/json'。当我设置为'application/x-www-form-urlencoded'时,它为我解决了错误。
而不是像这样使用post方法:
首先使用Angular的HttpHeaders类设置请求头,如:
参考:https://angular.io/guide/http#adding-and-updating-headers
在我的例子中,对于服务器上的响应头,'Access-Control-Allow-Origin'也被设置为 *,以接受来自任何来源的请求(在开发的例子中,主要是:localhost:4200)
zour9fqk7#
因此,为什么我们得到CORS错误,因为我们试图连接两个不同的域,但可能的原因可能是版本问题。在我的例子中,我使用了angular proxy,它工作得很好。当我们使用angular代理时,可能会出现这样的情况,因为你不知道如何完美地使用它。
qhhrdooz8#
我知道这已经回答了,但它可能会帮助一些人谁是搜索CORS的问题。您可以按照以下3个步骤来解决这个问题。1.创建proxy.conf.json文件并将其放在应用的根级别。2.在package.json文件中,在ngstart中添加代理参数3.在angular.json中,添加代理文件条目。4.将所有的rest调用改为/API/getData。
完整的一步一步的教程在这里给出。http://www.codeyourthought.com/angular/proxy-to-make-http-call-in-angular/
cunj1qz19#
由于您的angular应用程序运行在4200端口上,而后端运行在3000端口上,因此两个应用程序的起源不同。
为了解决这个问题,你可以在你的机器上设置“nginx”。
这将使所有来自angular和后端的请求都通过“nginx”服务器进行。从而解决了CORS的问题。