配置

配置

AdonisJS 应用的配置文件存储在 config 目录中。一个全新的 AdonisJS 应用自带少量由框架核心和已安装软件包使用的预置文件。

欢迎在 config 目录中创建你的应用所需的额外文件。

我们建议使用环境变量来存储密钥和与环境相关的配置。

导入配置文件

你可以使用标准的 JavaScript import 语句在应用代码库中导入配置文件。例如:

import { appKey } from '#config/app'
import databaseConfig from '#config/database'

导入配置文件后,你便可以访问其导出的值。在大多数情况下,这些导出是 ConfigProvider 实例,因此不建议直接使用它们的值。相反,请从已解析的配置中读取值。

使用配置服务

配置服务提供了读取配置值的另一种 API。在以下示例中,我们使用配置服务读取存储在 config/app.ts 文件中的 appKey 值。

import config from '@adonisjs/core/services/config'
config.get('app.appKey')
config.get('app.http.cookie') // 读取嵌套值

config.get 方法接受一个以点分隔的键,并按如下方式解析它。

  • 第一部分是你要读取值的文件名,即 app.ts 文件。
  • 字符串的其余部分是你要从导出值中访问的键,即本例中的 appKey

配置服务 vs. 直接导入配置文件

使用配置服务而非直接导入配置文件并没有直接的好处。不过,在外部软件包和 edge 模板中,配置服务是唯一的选择。

在外部软件包中读取配置

如果你正在创建一个第三方软件包,不应直接导入用户应用中的配置文件,因为这会让你的软件包与宿主应用的目录结构紧密耦合。

相反,你应该在服务提供者中使用配置服务来访问配置值。例如:

import { ApplicationService } from '@adonisjs/core/types'
export default class DriveServiceProvider {
constructor(protected app: ApplicationService) {}
register() {
this.app.container.singleton('drive', () => {
const driveConfig = this.app.config.get('drive')
return new DriveManager(driveConfig)
})
}
}

在 Edge 模板中读取配置

你可以使用 config 全局方法在 edge 模板中访问配置值。

<a href="{{ config('app.appUrl') }}"> 首页 </a>

你可以使用 config.has 方法检查给定键是否存在配置值。当值为 undefined 时,该方法返回 false

@if(config.has('app.appUrl'))
<a href="{{ config('app.appUrl') }}"> 首页 </a>
@else
<a href="/"> 首页 </a>
@end

更改配置位置

你可以通过修改 adonisrc.ts 文件来更新 config 目录的位置。更改后,配置文件将从新位置导入。

directories: {
config: './configurations'
}

请确保更新 package.json 文件中的导入别名。

{
"imports": {
"#config/*": "./configurations/*.js"
}
}

配置文件的限制

存储在 config 目录中的配置文件会在应用的启动阶段被导入。因此,配置文件不能依赖应用代码。

例如,如果你尝试在 config/app.ts 文件中导入并使用 router 服务,应用将无法启动。这是因为 router 服务在应用进入 booted(已启动)状态之前尚未配置。

从根本上说,这一限制对你的代码库有积极影响,因为应用代码应当依赖配置,而不是反过来。

在运行时更新配置

你可以使用配置服务在运行时变更配置值。config.set 会在内存中更新值,不会对磁盘上的文件做任何更改。

该配置值是对整个应用变更的,而不仅仅针对单个 HTTP 请求。这是因为 Node.js 不是线程化运行时,Node.js 中的内存在多个 HTTP 请求之间共享。

import env from '#start/env'
import config from '@adonisjs/core/services/config'
const HOST = env.get('HOST')
const PORT = env.get('PORT')
config.set('app.appUrl', `http://${HOST}:${PORT}`)