问题描述参见:ECONNREFUSED 127.0.0.1:53233 when running "serve-ssr" from @nguniversal/builders #1848

该issue至今仍是open状态,但近日在解决NestJSAngular Universal结合的问题时,却无意中找到了出现的原因、复现步骤,以及解决方法。

先附上原先出现问题的代码:

typescriptCopy code
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
const port = env.server.port || 4000; app().then((server) => { server.listen(port, () => { console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ifuyun.com listening on http://localhost:${port}`); }); });
const port = env.server.port || 4000; app().then((server) => { server.listen(port, () => { console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ifuyun.com listening on http://localhost:${port}`); }); });

这是一段再正常不过的代码,传入配置的端口,如果不存在则取默认值4000,怎么可能出问题呢?甚至,在看了源码,并debug后,依然一头雾水。😥

就这么delay了好久,直到前几天……

在新建一个项目后,发现其并没有出现同样的问题,便去对比了代码,发现问题出在port的使用上。正常的那份代码如下:

typescriptCopy code
  • 1
  • 2
  • 3
await app.listen(process.env.PORT, env.server.host, () => { logger.info(`Server listening on: ${env.server.host}:${process.env.PORT}`); });
await app.listen(process.env.PORT, env.server.host, () => { logger.info(`Server listening on: ${env.server.host}:${process.env.PORT}`); });

在这个版本中,实际上,process.env.PORT的值就是前一份代码中报错的那个端口(随机的),因此,也就不存在ECONNREFUSED的问题了。

但,怪异的是,第一种方式在生产环境(也即build后)中却是正常的。继续排查……