NodeJS Angular 7应用程序从angular客户端获取CORS错误

9wbgstp7  于 2023-06-22  发布在  Node.js
关注(0)|答案(9)|浏览(163)

我开发了一个带有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.comhttps://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)动态环境变量。我还错过了什么?

bfhwhh0e

bfhwhh0e1#

如果这只是为了开发,我建议使用angular-cli附带的代理。创建名为proxy.json的文件
和/或

{
  "/api/oauth2/login": {
    "target": "http://localhost:3000/api/oauth2/login",
    "secure": false
  }
}

以及调用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

vhipe2zx

vhipe2zx2#

对于Angular 7,您必须执行其他实现。从angular文档中,您必须创建一个proxy.js文件:
https://angular.io/guide/build#using-corporate-proxy
编辑您自己的后端服务器的路径。

proxy.js:

var HttpsProxyAgent = require('https-proxy-agent');
var proxyConfig = [{
  context: '/api',
  target: 'http://your-remote-server.com:3000',
  secure: false
}];

function setupForCorporateProxy(proxyConfig) {
  var proxyServer = process.env.http_proxy || process.env.HTTP_PROXY;
  if (proxyServer) {
    var agent = new HttpsProxyAgent(proxyServer);
    console.log('Using corporate proxy server: ' + proxyServer);
    proxyConfig.forEach(function(entry) {
      entry.agent = agent;
    });
  }
  return proxyConfig;
}

module.exports = setupForCorporateProxy(proxyConfig);

稍后将其添加到package.json

"start": "ng serve --proxy-config proxy.js"

并将其调用为:

npm start

在你的app.js中,只需简单地添加:

const cors = require("cors");
app.use(cors());

我也遇到了同样的问题,这解决了我的问题。我希望它有帮助!

wlsrxk51

wlsrxk513#

要将http://localhost:4200/api的所有调用转移到在http://localhost:3000/api上运行的服务器,请执行以下步骤。
1.在package.json旁边的项目src/文件夹中创建一个文件proxy.conf.json
1.将以下内容添加到新代理文件中:

{
    "/api": {
        "target": "`http://localhost:3000`",
        "secure": false
    }
}

1.在CLI配置文件angular.json中,将proxyConfig选项添加到serve目标:

...
"architect": {
    "serve": {
        "builder": "@angular-devkit/build-angular:dev-server",
        "options": {
            "browserTarget": "your-application-name:build",
            "proxyConfig": "src/proxy.conf.json"
        },
    ...
    }
}
...

1.要使用此代理配置运行开发服务器,请调用ng serve

pcrecxhr

pcrecxhr4#

我改变了回调机制来解决CORS问题,我利用OAuth流让用户从重定向到https://example.com/auth/callbackhttps://example.com进行身份验证,我从http://localhost:4200发起请求,然后将回调URL发送到服务器http://localhost:3000,我得到了CORS错误。
现在,我将其重定向到客户端http://localhost:4200,并解决了CORS问题。所有其他对GET、POST、DELETE、PATCH的调用都来自工作正常的http://localhost:3000
谢谢大家的意见。

gc0ot86w

gc0ot86w5#

我一直在服务器端使用Angular cli和**.net Framework**。
为了解决这个问题,我只是使用以下步骤在服务器端启用CORS交互:

  1. Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.2.6
    然后,在WebApiConfig类中:
    1.添加using System.Web.Http.Cors;
  2. Inside Register(HttpConfiguration config)方法:
var cors = new EnableCorsAttribute("http://localhost:4200", "*", "*");

config.EnableCors(cors);

var cors = new EnableCorsAttribute("*", "*", "*"); //origin, headers, methods

config.EnableCors(cors);
uoifb46i

uoifb46i6#

默认情况下,Angular设置了一些请求头参数,其中一个是'Content-Type',其默认值是'application/json'。当我设置为'application/x-www-form-urlencoded'时,它为我解决了错误。
而不是像这样使用post方法:

this.http.post<any>(requestDetails['url'],requestDetails['data'])

首先使用Angular的HttpHeaders类设置请求头,如:

let reqHeaders = new HttpHeaders({
   'Content-Type':'application/x-www-form-urlencoded'
});
this.http.post<any>(requestDetails['url'],requestDetails['data'],{headers:reqHeaders})

参考:https://angular.io/guide/http#adding-and-updating-headers
在我的例子中,对于服务器上的响应头,'Access-Control-Allow-Origin'也被设置为 *,以接受来自任何来源的请求(在开发的例子中,主要是:localhost:4200)

zour9fqk

zour9fqk7#

因此,为什么我们得到CORS错误,因为我们试图连接两个不同的域,但可能的原因可能是版本问题。在我的例子中,我使用了angular proxy,它工作得很好。当我们使用angular代理时,可能会出现这样的情况,因为你不知道如何完美地使用它。

qhhrdooz

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/

cunj1qz1

cunj1qz19#

由于您的angular应用程序运行在4200端口上,而后端运行在3000端口上,因此两个应用程序的起源不同。
为了解决这个问题,你可以在你的机器上设置“nginx”。
这将使所有来自angular和后端的请求都通过“nginx”服务器进行。从而解决了CORS的问题。

相关问题