I am trying to run a simple application. I have an Express backend which returns a JSON string when visited at localhost:4201/ticker
. When I run the server and make a request to this link from my Angular Service over http
, I get the following error:
XMLHttpRequest cannot load localhost:4201/ticker. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
I read the following article: Understanding and Using CORS and as stated, used the cors
module with my express server. However, I am still getting the error as given above. Part of code is given below:
Server code:
private constructor(baseUrl: string, port: number) { this._baseUrl = baseUrl; this._port = port; this._express = Express(); this._express.use(Cors()); this._handlers = {}; this._hInstance = new Handlers(); this.initHandlers(); this.initExpress(); } private initHandlers(): void { // define all the routes here and map to handlers this._handlers['ticker'] = this._hInstance.ticker; } private initExpress(): void { Object.keys(this._handlers) .forEach((key) => { this._express.route(this._url(key)) .get(this._handlers[key]); }); } private _url(k: string): string { return '/' + k; }
Here is the handler function:
ticker(req: Request, res: Response): void { Handlers._poloniex .getTicker() .then((d) => { return Filters.tickerFilter(d, Handlers._poloniex.getBases()); }) .then((fdata) => { //res.header('Access-Control-Allow-Origin', "*"); //res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header('Content-Type', 'application/json'); res.send(JSON.stringify(fdata)); }) .catch((err) => { this._logger.log([ 'Error: ' + err.toString(), 'File: ' + 'handlers.class.ts', 'Method: ' + 'ticker' ], true); }); }
Here is my Angular Service:
export class LiveTickerService { private _baseUrl: string; private _endpoints: {[key:string]: string}; constructor( private _http: Http ) { this._baseUrl = 'localhost:4201/'; this._endpoints = { 'ticker': 'ticker' }; } getTickerData(): Observable<Response> { return this._http.get(this._baseUrl + this._endpoints['ticker']) .map(resp => resp.json()) } }
Here is how I am using my Service:
getTicker() { let a = new Array<{[key: string]: any}>(); this._tickerService.getTickerData() .subscribe( data => { let parsed = JSON.parse(JSON.stringify(data)); Object.keys(parsed) .forEach((k) => { a.push({k: parsed[k]}); }); this.data = a; }, error => console.log(error.toString()), () => console.log('Finished fetching ticker data') ); return this.data; }
Just change the url to http://localhost instead of localhost . If you open the html file from local, you should create a local server to serve that html file, the simplest way is using Web Server for Chrome . That will fix the issue.
CORS requests may only use the HTTP or HTTPS URL scheme, but the URL specified by the request is of a different type. This often occurs if the URL specifies a local file, using the file:/// scheme.
Reason: CORS request not HTTP This often occurs if the URL specifies a local file, using a file:/// URL. To fix this problem, make sure you use HTTPS URLs when issuing requests involving CORS, such as XMLHttpRequest , Fetch APIs, Web Fonts ( @font-face ), and WebGL textures, and XSL stylesheets.
The CORS behavior, commonly termed as CORS error, is a mechanism to restrict users from accessing shared resources. This is not an error but a security measure to secure users or the website which you are accessing from a potential security bleach.
XMLHttpRequest cannot load localhost:4201/ticker. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
Any time you see that “only supported for protocol schemes” message, it almost certainly means you’ve just forgotten to put the https
or http
on the request URL in your code.
So in this case, the fix is to use the URL http://localhost:4201/ticker
in your code here:
this._baseUrl = 'http://localhost:4201/';
…because without the http://
there, localhost:4201/ticker
isn’t really the URL you intend.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With