配置
你的 AdonisJS 应用程序的配置文件存储在 config
目录中。一个新的 AdonisJS 应用程序会附带一些由框架核心和已安装包使用的预置文件。
请随意在 config
目录中创建你的应用程序所需的额外文件。
我们建议使用 环境变量 来存储敏感信息和特定环境的配置。
导入配置文件
你可以使用标准的 JavaScript import
语句在应用程序代码库中导入配置文件。例如:
import { appKey } from '#config/app'
import databaseConfig from '#config/database'
使用配置服务
配置服务提供了一个替代 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') }}"> Home </a>
你可以使用 config.has
方法来检查给定键是否存在配置值。如果值为 undefined
,则该方法返回 false
。
@if(config.has('app.appUrl'))
<a href="{{ config('app.appUrl') }}"> Home </a>
@else
<a href="/"> Home </a>
@end
更改配置位置
你可以通过修改 adonisrc.ts
文件来更新配置目录的位置。更改后,将从新位置导入配置文件。
directories: {
config: './configurations'
}
请确保更新 package.json
文件中的导入别名。
{
"imports": {
"#config/*": "./configurations/*.js"
}
}
配置文件的限制
在应用程序的启动阶段导入存储在 config
目录中的配置文件。因此,配置文件不能依赖应用程序代码。
例如,如果你尝试在 config/app.ts
文件中导入和使用路由服务,应用程序将无法启动。这是因为路由服务直到应用程序处于 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}`)