Express应用适配开发环境与Cloud Functions的实现及疑问
问题
我有一个在开发模式下通过端口监听运行的Express应用,但部署至Cloud Functions时需要通过https.onRequest导出应用。请问是否可以通过环境变量判断的if条件来实现两种场景的区分?
目前不使用条件判断(如代码示例2)也能正常运行,但我不清楚部署到Firebase服务器后,app.listen是否会持续监听端口、占用内存?希望能得到相关解释。
代码示例1
... .use(router) .use(ErrorHandler); if (process.env.NODE_ENV && process.env.NODE_ENV.trim() == 'development') { app.listen(config.DEV_PORT, () => { console.log(`Webserver started. Port ${config.DEV_PORT} is listening...`); console.log(`Hosting URL: http://localhost:${config.DEV_PORT}/`); }); } else { const functions = require('firebase-functions'); exports.app = functions.https.onRequest(app); }
代码示例2
... .use(router) .use(ErrorHandler); app.listen(config.DEV_PORT, () => { console.log(`Webserver started. Port ${config.DEV_PORT} is listening...`); console.log(`Hosting URL: http://localhost:${config.DEV_PORT}/`); }); const functions = require('firebase-functions'); exports.app = functions.https.onRequest(app);
回答
当然可以通过环境变量的条件判断来区分开发与部署场景,代码示例1的写法是完全合理且推荐的实践。
关于代码示例2的疑问:部署到Cloud Functions后,app.listen并不会持续监听端口——Cloud Functions属于无服务器架构,函数的请求由Google的负载均衡层直接转发到Express应用实例,而非通过端口监听接收请求。但执行app.listen会创建一个额外的HTTP服务器实例,这个实例在部署环境中完全无用,却会占用额外的内存资源,还可能延长函数的冷启动时间。
此外,Cloud Functions的运行环境中没有开放端口供你监听,即使调用了app.listen,也无法对外提供服务,反而会产生不必要的资源消耗。因此,用NODE_ENV环境变量做条件判断,只在开发环境启动端口监听,是更高效、更规范的做法。
内容的提问来源于stack exchange,提问作者Oleksii Sinkov
相关产品推荐
相关产品推荐

