简体   繁体   中英

NodeJS Proxy Server for Heroku

I am building a NodeJS/express application in which I need to forward some requests to my Heroku API.

I have explored a number of different solutions (including this SO question ), but none of them appear to work for me.

Code:

const API_SERVER = 'https://my-api.herokuapp.com';

const path = require('path'),
      fs = require('fs'),
      express = require('express'),
      router  = express.Router(),
      httpProxy = require('http-proxy'),
      apiProxy = httpProxy.createProxyServer({
          target: API_SERVER,
          secure: true,
          ssl: {
              key: fs.readFileSync(path.join('ssl', 'key.pem'),'utf8'),
              cert: fs.readFileSync(path.join('ssl', 'cert.pem'), 'utf8')
          }
      });

router.all('/api/*', (req, res) => {
    apiProxy.web(req, res);
});

module.exports = router;

My express server functions normally, but when I make requests to localhost/api/some-route I get the following error:

Error: Hostname/IP doesn't match certificate's altnames: "Host: localhost. is not in the cert's altnames: DNS:*.herokuapp.com, DNS:herokuapp.com"
    at Object.checkServerIdentity (tls.js:199:17)
    at TLSSocket.<anonymous> (_tls_wrap.js:1091:29)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:603:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:433:38)

Details:
    killed: false
    code: 1
    signal: null
    cmd: node ./server/index.js
Stack:
Error: Command failed: node ./server/index.js
C:\Users\web-app\node_modules\http-proxy\lib\http-proxy\index.js:119
    throw err;
    ^

Error: Hostname/IP doesn't match certificate's altnames: "Host: localhost. is not in the cert's altnames: DNS:*.herokuapp.com, DNS:herokuapp.com"
    at Object.checkServerIdentity (tls.js:199:17)
    at TLSSocket.<anonymous> (_tls_wrap.js:1091:29)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:603:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:433:38)

    at ChildProcess.exithandler (child_process.js:206:12)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

From what I can gather in that error message, Heroku doesn't seem to like the fact I'm proxying from a localhost... but I'm not really sure what else to try.

I have tried creating httpProxy.createProxyServer() with SSL (as in the example above, with self-signed SSL certs) and without SSL, but I get the same error.

After a lot of trial, error, and hair-pulling I ended up creating an issue on the http-proxy-middleware project.

I don't know specifically what solved the error I mentioned above, but the biggest issue I saw was caused by configuring http-proxy-middleware (which uses http-proxy under the hood) after other express middleware bits -- specifically body-parser .

The moral of the story was that http-proxy-middleware should be among the first (if not the first) piece of middleware you configure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM