Skip to content

配置

你的 AdonisJS 应用程序的配置文件存储在 config 目录中。一个全新的 AdonisJS 应用程序附带了一些框架核心和已安装包使用的预存在文件。

你可以随意在 config 目录中创建应用程序所需的其他文件。

TIP

我们建议使用环境变量来存储密钥和特定于环境的配置。

导入配置文件

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

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

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

使用配置服务

配置服务提供了一个用于读取配置值的替代 API。在下面的例子中,我们使用配置服务来读取存储在 config/app.ts 文件中的 appKey 值。

ts
import config from '@adonisjs/core/services/config'

config.get('app.appKey')
config.get('app.http.cookie') // 读取嵌套值

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

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

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

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

在外部包中读取配置

如果你正在创建第三方包,你不应该直接从用户应用程序导入配置文件,因为这会使你的包与主机应用程序的文件夹结构紧密耦合。

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

ts
import { ApplicationService } from '@adonisjs/core/types'

export default class DriveServiceProvider {
  constructor(protected app: ApplicationService) {}
  
  register() {
    this.app.container.singleton('drive', () => {
      // highlight-start
      const driveConfig = this.app.config.get('drive')
      return new DriveManager(driveConfig)
      // highlight-end
    })
  }
}

在 Edge 模板中读取配置

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

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

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

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

更改配置位置

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

ts
directories: {
  config: './configurations'
}

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

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

配置文件限制

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

例如,如果你尝试在 config/app.ts 文件中导入和使用路由器服务,应用程序将无法启动。这是因为路由器服务直到应用程序处于 booted 状态才会配置。

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

在运行时更新配置

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

TIP

配置值会为整个应用程序修改,而不仅仅是单个 HTTP 请求。这是因为 Node.js 不是线程运行时,Node.js 中的内存在多个 HTTP 请求之间共享。

ts
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}`)