You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置AdonisJS 4.1监听HTTPS:hook添加SSL代码后不生效如何解决?

问题原因
  • 仅在before.httpServer钩子中返回HTTPS实例无效:AdonisJS 4.1不会自动使用你创建的HTTPS实例处理请求,也不会自动将内置的请求处理逻辑绑定到该实例上。
  • 证书路径风险:使用./ssl/相对路径读取证书,若启动项目时的工作目录不是项目根目录,会出现证书读取失败,导致HTTPS服务初始化异常。
  • 资源加载校验:需要确认preLoad配置的路径和实际hook文件路径一致,若hook文件名为hooks.js而非hook.js,会出现加载失效的问题。
解决步骤
  1. 修正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()
  })
})
  1. 校验路径配置
    确认你的ssl目录放在项目根目录下,包含serverkey.key和servercrt.crt两个文件,若存放路径不同,同步修改代码中读取证书的路径即可。
  2. 校验preLoad配置
    确认你的hook文件路径为项目根目录/start/hook.js,和server.js中preLoad('start/hook')的配置一致。
  3. 启动测试
    重启项目,访问控制台输出的HTTPS地址即可验证服务是否正常运行。

补充说明

如果需要同时支持HTTP和HTTPS访问,删除代码中Server.getInstance().close()这一行即可,原HTTP服务会继续监听.env中配置的PORT端口,HTTPS服务监听你指定的端口。

内容的提问来源于stack exchange,提问作者Aslam Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:11