@ikenxuan/amagi
使用指南

事件系统

使用 amagi 的事件驱动架构

事件系统

amagi v6 采用事件驱动架构,移除了对 log4js 的依赖,通过事件系统提供日志、监控等功能。

基本用法

import amagi, { amagiEvents } from '@ikenxuan/amagi'

// 方式 1:通过客户端实例
const client = amagi({ cookies: { ... } })
client.events.on('api:success', (data) => {
  console.log(`[${data.platform}] ${data.methodType} 成功`)
})

// 方式 2:通过全局事件对象
amagiEvents.on('log:info', (data) => {
  console.log(data.message)
})

// 方式 3:通过静态方法
amagi.on('api:error', (data) => {
  console.error(`API 错误: ${data.errorMessage}`)
})

事件类型

日志事件

事件名说明数据类型
log:info信息日志LogEventData
log:warn警告日志LogEventData
log:error错误日志LogEventData
log:debug调试日志LogEventData
log:mark标记日志LogEventData
interface LogEventData {
  level: 'info' | 'warn' | 'error' | 'debug' | 'mark'
  message: string
  args?: unknown[]
  timestamp: Date
}

HTTP 事件

事件名说明数据类型
http:requestHTTP 请求发起HttpRequestEventData
http:responseHTTP 响应接收HttpResponseEventData
http:errorHTTP 错误NetworkErrorEventData
interface HttpRequestEventData {
  method: string
  url: string
  headers?: Record<string, string>
  timestamp: Date
}

interface HttpResponseEventData {
  method: string
  url: string
  statusCode: number
  responseTime: number
  clientIP?: string
  requestSize?: string
  responseSize?: string
  timestamp: Date
}

网络事件

事件名说明数据类型
network:retry网络重试NetworkRetryEventData
network:error网络错误NetworkErrorEventData
interface NetworkRetryEventData {
  errorCode: string
  attempt: number
  maxRetries: number
  delayMs: number
  url?: string
  timestamp: Date
}

interface NetworkErrorEventData {
  errorCode: string
  message: string
  retries: number
  url?: string
  timestamp: Date
}

API 事件

事件名说明数据类型
api:successAPI 调用成功ApiSuccessEventData
api:errorAPI 调用失败ApiErrorEventData
interface ApiSuccessEventData {
  platform: 'douyin' | 'bilibili' | 'kuaishou' | 'xiaohongshu'
  methodType: string
  response: unknown
  statusCode: number
  duration: number
  timestamp: Date
}

interface ApiErrorEventData {
  platform: 'douyin' | 'bilibili' | 'kuaishou' | 'xiaohongshu'
  methodType: string
  errorCode?: string | number
  errorMessage: string
  url?: string
  duration?: number
  timestamp: Date
}

实现自定义日志

使用 console

import { amagiEvents } from '@ikenxuan/amagi'

amagiEvents.on('log:info', (data) => console.log(`[INFO] ${data.message}`))
amagiEvents.on('log:warn', (data) => console.warn(`[WARN] ${data.message}`))
amagiEvents.on('log:error', (data) => console.error(`[ERROR] ${data.message}`))
amagiEvents.on('log:debug', (data) => console.debug(`[DEBUG] ${data.message}`))

使用 pino

import { amagiEvents } from '@ikenxuan/amagi'
import pino from 'pino'

const logger = pino()

amagiEvents.on('log:info', (data) => logger.info(data.message))
amagiEvents.on('log:warn', (data) => logger.warn(data.message))
amagiEvents.on('log:error', (data) => logger.error(data.message))
amagiEvents.on('log:debug', (data) => logger.debug(data.message))

使用 winston

import { amagiEvents } from '@ikenxuan/amagi'
import winston from 'winston'

const logger = winston.createLogger({
  transports: [new winston.transports.Console()]
})

amagiEvents.on('log:info', (data) => logger.info(data.message))
amagiEvents.on('log:error', (data) => logger.error(data.message))

API 监控示例

import { amagiEvents } from '@ikenxuan/amagi'

// 统计 API 调用
const stats = {
  success: 0,
  error: 0,
  totalDuration: 0
}

amagiEvents.on('api:success', (data) => {
  stats.success++
  stats.totalDuration += data.duration
  console.log(`✓ [${data.platform}] ${data.methodType} - ${data.duration}ms`)
})

amagiEvents.on('api:error', (data) => {
  stats.error++
  console.error(`✗ [${data.platform}] ${data.methodType} - ${data.errorMessage}`)
})

// 定期输出统计
setInterval(() => {
  const avgDuration = stats.success > 0 ? stats.totalDuration / stats.success : 0
  console.log(`统计: 成功 ${stats.success}, 失败 ${stats.error}, 平均耗时 ${avgDuration.toFixed(2)}ms`)
}, 60000)

一次性监听

使用 once 方法注册只触发一次的监听器:

amagiEvents.once('api:success', (data) => {
  console.log('首次 API 调用成功')
})

移除监听器

const handler = (data) => console.log(data.message)

// 注册
amagiEvents.on('log:info', handler)

// 移除
amagiEvents.off('log:info', handler)

On this page