You know CORS otherwise you would not read this article, I guess. So let's get beyond it and straight to the solution coded in a few lines of JavaScript. Or better before, show the problem.
My demo page below shows it.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <textarea id="output" rows="20" cols="120"></textarea> <script type="module"> const outputNode = document.getElementById('output') const TARGET_URL = 'https://datahub.erde-und-umwelt.de/en/api/getServiceConfiguration/climateResilience' const URL = TARGET_URL // const URL = `http://localhost:8088/${TARGET_URL}` fetch(URL) .then((response) => response.json()) .then((data) => outputNode.textContent = JSON.stringify(data, null, 2)) .catch((exception) => { outputNode.textContent = exception }) </script> </body> </html> It simply tries to request some JSON data from a REST API and puts the result into a textarea.
But this does not happen, because of the wrong CORS header - the request is not allowed for every client.
So it only shows an error.
To get beyond this, you can write a backend that requests the data for you and put it through with a universal CORS header, so everyone can use it.
I will write this backend in NodeJS means JavaScript. The idea is, as also visible in the page, putting a proxy in front of the requested URL like this:
http://localhost:8088/${TARGET_URL} That means a request to http://example.de is prefixed with http://localhost:8080 in result gives http://localhost:8080/http://example.de
The proxy receives the request and extracts the requested URL from the request and requests the data.
The code is pretty simple using the http-proxy-middleware.
There is not much to do, at all, as you can see below.
const express = require('express') const cors = require('cors') const { createProxyMiddleware } = require('http-proxy-middleware') const app = express() app.use(cors()) app.use(createProxyMiddleware({ router: (req) => new URL(req.path.substring(1)), pathRewrite: (path, req) => (new URL(req.path.substring(1))).pathname, changeOrigin: true, logger: console })) app.listen(8088, () => { console.info('proxy server is running on port 8088') }) I therefore use the external NodeJS modules express, http-proxy-middleware and cors.
How is it done?
This creates the server.
const app = express() This enables CORS for all routes, methods and clients.
app.use(cors()) The only special tricky line is this.
app.use(createProxyMiddleware({ router: (req) => new URL(req.path.substring(1)), pathRewrite: (path, req) => (new URL(req.path.substring(1))).pathname, changeOrigin: true, logger: console })) It creates the middleware. The middleware routes to the embedded URL and rewrites the path.
And that's it. You created a CORS Proxy in NodeJS.
Top comments (1)
This is great. Thank you!