配置AdonisJS 4.1监听HTTPS:hook添加SSL代码后不生效如何解决?
问题原因
- 仅在
before.httpServer钩子中返回HTTPS实例无效:AdonisJS 4.1不会自动使用你创建的HTTPS实例处理请求,也不会自动将内置的请求处理逻辑绑定到该实例上。 - 证书路径风险:使用
./ssl/相对路径读取证书,若启动项目时的工作目录不是项目根目录,会出现证书读取失败,导致HTTPS服务初始化异常。 - 资源加载校验:需要确认
preLoad配置的路径和实际hook文件路径一致,若hook文件名为hooks.js而非hook.js,会出现加载失效的问题。
解决步骤
- 修正hook文件代码
替换你的start/hook.js文件内容为以下代码,逻辑包含:使用绝对路径读取证书、绑定Adonis请求处理逻辑到HTTPS实例、替换默认监听逻辑:
const { hooks } = require('@adonisjs/ignitor') const Helpers = use('Helpers') const Server = use('Server') const Env = use('Env') const https = require('https') const fs = require('fs') hooks.before.httpServer(() => { // 读取证书,ssl目录放在项目根目录的话就用Helpers.appRoot,放在public目录就用Helpers.publicPath const certOptions = { key: fs.readFileSync(Helpers.appRoot('ssl/serverkey.key')), cert: fs.readFileSync(Helpers.appRoot('ssl/servercrt.crt')), // 若证书有密码,补充下行配置,替换为实际密码 // passphrase: 'your_ssl_cert_password' } // 绑定Adonis请求处理逻辑到HTTPS服务器 const httpsServer = https.createServer(certOptions, Server.getInstance()) hooks.after.httpServer(() => { // 读取HTTPS监听配置,可在.env文件中新增HTTPS_PORT、HTTPS_HOST参数自定义 const port = Env.get('HTTPS_PORT', 443) const host = Env.get('HTTPS_HOST', '0.0.0.0') // 启动HTTPS服务 httpsServer.listen(port, host, () => { console.log(`HTTPS service running at https://${host}:${port}`) }) // 不需要保留HTTP服务就保留下行,需要同时支持HTTP和HTTPS就删掉下行 Server.getInstance().close() }) })
- 校验路径配置
确认你的ssl目录放在项目根目录下,包含serverkey.key和servercrt.crt两个文件,若存放路径不同,同步修改代码中读取证书的路径即可。 - 校验preLoad配置
确认你的hook文件路径为项目根目录/start/hook.js,和server.js中preLoad('start/hook')的配置一致。 - 启动测试
重启项目,访问控制台输出的HTTPS地址即可验证服务是否正常运行。
补充说明
如果需要同时支持HTTP和HTTPS访问,删除代码中Server.getInstance().close()这一行即可,原HTTP服务会继续监听.env中配置的PORT端口,HTTPS服务监听你指定的端口。
内容的提问来源于stack exchange,提问作者Aslam Patel
相关产品推荐
相关产品推荐

