ctx.router.get('/path', (ctx, next) => {
  // handle request
})
上下文 (Context)
上下文 (Context) 是 Koishi 的重要概念。你的每一个插件,中间件,监听器和指令都被绑定在上下文上。
实例属性
下面的属性为了访问方便而绑定,严格上它们对一个 App 实例下的所有上下文都是相同的。
ctx.database
- 类型: 
Database 
当前应用的 Database 对象。
ctx.router
- 类型: 
KoaRouter 
如果你配置了 port 选项,则这个属性将作为一个 KoaRouteropen in new window 实例。你可以在上面自定义新的路由:
ctx.bots
- 类型: 
Bot[] & Record<string, Bot> 
一个键值对,保存了当前应用下的所有 Bot 实例。
TIP
在使用多机器人时,Koishi 不能保证 ctx.bots[0] 的行为一致。因此,如果想要通过这个接口访问单个机器人的 API,请使用以下的形式访问:
ctx.bots[`${platform}:${selfId}`]
// platform 为对应机器人的所在平台,而 selfId 为对应机器人的 ID
// 一般而言,platform 可以从 session.platform,而 selfId 可以从 session.selfId 获得
// 不过也有需要从别的地方获取这两个值的情况
过滤器
有关这里的 API,请参见 使用上下文。
ctx.all()
- 返回值: 
Context新的上下文 
选取上下文全集。
TIP
这个方法与 ctx.app 的区别在于,后者不受插件管理器控制,容易产生内存泄漏。因此我们建议,除非你已经为你的插件声明了副作用,你应当尽量使用这个方法。参见 插件热重载。
ctx.self(...values)
ctx.user(...values)
ctx.group(...values)
ctx.channel(...values)
ctx.platform(...values)
- values: 
string[]允许的机器人 / 用户 / 群组 / 频道 / 平台名称构成的数组 - 返回值: 
Context新的上下文 
选取当前上下文的子集,限定机器人 / 用户 / 群组 / 频道 / 平台名称为所给定的值。
ctx.{type}.except(...values)
- values: 
string[]禁止的机器人 / 用户 / 群组 / 频道 / 平台名称构成的数组 - 返回值: 
Context新的上下文 
选取当前上下文的子集,排除机器人 / 用户 / 群组 / 频道 / 平台名称为所给定的值。这里的 type 同上文。
ctx.select(key, ...values)
- values: 
string[]如果非空则表示允许的 key 属性可选值;否则只需 key 属性为 truthy 即可 - 返回值: 
Context新的上下文 
选取当前上下文的子集,限定会话对象的 key 属性所对应的值。
ctx.unselect(key, ...values)
- values: 
string[]如果非空则表示允许的 key 属性禁用值;否则只需 key 属性为 falsy 即可 - 返回值: 
Context新的上下文 
选取当前上下文的子集,排除会话对象的 key 属性所对应的值。
ctx.union(filter)
- context: 
Context | ((session: Session) => boolean)另一个上下文或者过滤器函数 - 返回值: 
Context新的上下文 
给出当前上下文和其他上下文的并集。
ctx.intersect(filter)
- context: 
Context | ((session: Session) => boolean)另一个上下文或者过滤器函数 - 返回值: 
Context新的上下文 
给出当前上下文和其他上下文的交集。
ctx.except(filter)
- context: 
Context | ((session: Session) => boolean)另一个上下文或者过滤器函数 - 返回值: 
Context新的上下文 
给出当前上下文和其他上下文的差集。
ctx.match(session)
- session: 
Session会话对象 - 返回值: 
boolean匹配结果 
测试上下文能否匹配会话对象。
钩子与中间件
有关这里的 API,请参见 事件系统。
ctx.emit(session?, event, ...param)
ctx.parallel(session?, event, ...param)
- session: 
Session会话对象 - event: 
string事件名称 - param: 
any[]事件的参数 - 返回值: 
boolean匹配结果 
同时触发所有 event 事件的能够匹配 session 对象的回调函数。emit 为同步,parallel 为异步。
ctx.bail(session?, event, ...param)
ctx.serial(session?, event, ...param)
- session: 
Session会话对象 - event: 
string事件名称 - param: 
any[]事件的参数 - 返回值: 
boolean匹配结果 
依次触发所有 event 事件的能够匹配 session 对象的回调函数。当返回一个 false, null, undefined 以外的值时将这个值作为结果返回。bail 为同步,serial 为异步。
ctx.chain(session?, event, ...param)
ctx.waterfall(session?, event, ...param)
- session: 
Session会话对象 - event: 
string事件名称 - param: 
any[]事件的参数 - 返回值: 
boolean匹配结果 
依次触发所有 event 事件的能够匹配 session 对象的回调函数。每次用得到的返回值覆盖下一轮调用的第一个参数,并在所有函数执行完后返回最终结果。chain 为同步,waterfall 为异步。
ctx.on(event, listener, prepend?)
- event: 
string事件名称 - listener: 
Function回调函数 - prepend: 
boolean是否前置 - 返回值: 
() => boolean取消这个监听器 
监听一个事件。
ctx.once(event, listener, prepend?)
- event: 
string事件名称 - listener: 
Function回调函数 - prepend: 
boolean是否前置 - 返回值: 
() => boolean取消这个监听器 
监听一个事件,且确保回调函数只会被执行一次。
ctx.before(event, listener, append?)
- event: 
string事件名称 - listener: 
Function回调函数 - append: 
boolean是否后置 - 返回值: 
() => boolean取消这个监听器 
监听一个以 before- 开头的事件。
ctx.middleware(middleware, prepend?)
- middleware: 
Middleware要注册的中间件 - prepend: 
boolean是否前置 - 返回值: 
() => boolean取消这个中间件 
当前上下文中注册一个中间件。
指令与插件
ctx.plugin(plugin, options?)
- plugin: 
Plugin要安装的插件 - options: 
any要传入插件的参数,如果为false则插件不会被安装 - 返回值: 
this 
当前上下文中安装一个插件。
type PluginFunction<U> = (ctx: Context, options: U) => void
type PluginObject<U> = { apply: PluginFunction<T, U> }
type Plugin<U> = PluginFunction<T, U> | PluginObject<T, U>
ctx.with(deps, plugin)
- deps: 
string[]依赖列表 - plugin: 
Plugin要安装的插件 - 返回值: 
this 
安装一个存在依赖的插件,参见 声明依赖关系。请注意:这里的依赖列表都应该是 node 模块名,并且都必须直接以插件的形式导出(如所有官方插件都具备这个特征)。
ctx.command(def, desc?, config?)
- def: 
string指令名以及可能的参数 - desc: 
string指令的描述 - config: 
CommandConfig指令的配置- hidden: 
boolean是否在隐藏指令,默认为false - checkUnknown: 
boolean是否对未知选项进行检测,默认为false - checkArgCount: 
boolean是否对参数个数进行检测,默认为false - authority: 
number最低调用权限,默认为1 - maxUsage: 
number每天最多调用次数,默认为Infinity - minInterval: 
number每次调用最短时间间隔,默认为0 - showWarning: 
boolean当小于最短间隔时是否进行提醒,默认为false - usageName: 
string调用标识符,默认为指令名,如果多个指令使用同一个标识符,则它们的调用次数将合并计算 
 - hidden: 
 - 返回值: 
Command注册或修改的指令 
在当前上下文中注册或修改一个指令。关于指令的文档详见 指令 API。
ctx.getSelfIds(type?, assignees?)
- type: 
Platform平台名称,如果不写就对应全部平台 - assignees: 
string[]机器人 ID 列表,如果不写就对应当前平台的全部机器人 - 返回值: 
Record<string, readonly string[]>平台名到机器人 ID 列表的键值对 
按平台名称对机器人分类。
ctx.broadcast(channels?, content, forced?)
- channels: 
string[]频道列表 - content: 
string要发送的内容 - forced: 
boolean是否无视 silent 标记 - 返回值: 
Promise<string[]>成功发送的消息 ID 列表 
所有机器人向自己分配的频道广播消息,存在标记 silent 的频道除外。如有失败不会抛出错误。参见 发送广播消息。
ctx.logger(scope?)
- scope: 
string要指定的类型,默认为'' - 返回值: 
Logger 
根据 namespace 生成一个 Logger 对象。
ctx.dispose(plugin?)
- plugin: 
Plugin要移除的插件 - 返回值: 
void 
移除插件中所注册的钩子、中间件、指令和子插件等。plugin 是默认为当前上下文所在的插件。如果既没有提供 plugin,上下文也不是一个插件上下文的话,会抛出一个错误。参见 卸载插件。
静态属性和方法
Context.current
- 类型: 
symbol 
特殊的键值,可以在通用上下文属性对象的方法上访问。参见 声明通用上下文属性。
Context.delegate(name) beta
- name: 
string属性名称 
声明一个通用上下文属性。参见 声明通用上下文属性。