128 lines
3.3 KiB
JavaScript
128 lines
3.3 KiB
JavaScript
import YAML from 'yaml'
|
||
import fs from 'fs'
|
||
import common from '../common/common.js'
|
||
import { createClient } from 'redis'
|
||
|
||
import { createRequire } from 'module'
|
||
const require = createRequire(import.meta.url)
|
||
const { exec } = require('child_process')
|
||
|
||
/**
|
||
* 初始化全局redis客户端
|
||
*/
|
||
export default async function redisInit () {
|
||
logger.mark('连接redis....')
|
||
const file = './config/config/redis.yaml'
|
||
const cfg = YAML.parse(fs.readFileSync(file, 'utf8'))
|
||
|
||
let redisUrl = ''
|
||
if (cfg.password) {
|
||
redisUrl = `redis://:${cfg.password}@${cfg.host}:${cfg.port}`
|
||
} else {
|
||
redisUrl = `redis://${cfg.host}:${cfg.port}`
|
||
}
|
||
|
||
// 初始化reids
|
||
let client = createClient({ url: redisUrl })
|
||
|
||
try {
|
||
await client.connect()
|
||
} catch (error) {
|
||
let err = error.toString()
|
||
|
||
if (err != 'Error: connect ECONNREFUSED 127.0.0.1:6379') {
|
||
logger.error('redis链接失败!')
|
||
process.exit()
|
||
}
|
||
|
||
/** windows */
|
||
if (process.platform == 'win32') {
|
||
logger.error('请先开启Redis')
|
||
logger.error('window系统:双击redis-server.exe启动')
|
||
process.exit()
|
||
} else {
|
||
let cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes'
|
||
let arm = await aarch64()
|
||
/** 安卓端自动启动redis */
|
||
if (arm) {
|
||
client = await startRedis(`${cmd}${arm}`, client, redisUrl)
|
||
} else {
|
||
logger.error('请先开启Redis')
|
||
logger.error(`redis启动命令:${cmd} ${arm}`)
|
||
process.exit()
|
||
}
|
||
}
|
||
}
|
||
|
||
client.on('error', async (err) => {
|
||
let log = { error: (log) => console.log(log) }
|
||
if (typeof logger != 'undefined') log = logger
|
||
if (err == 'Error: connect ECONNREFUSED 127.0.0.1:6379') {
|
||
if (process.platform == 'win32') {
|
||
log.error('请先开启Redis')
|
||
log.error('window系统:双击redis-server.exe启动')
|
||
} else {
|
||
let cmd = 'redis-server --save 900 1 --save 300 10 --daemonize yes'
|
||
let arm = await aarch64()
|
||
log.error('请先开启Redis')
|
||
log.error(`redis启动命令:${cmd} ${arm}`)
|
||
}
|
||
} else {
|
||
log.error(`redis错误:${err}`)
|
||
}
|
||
process.exit()
|
||
})
|
||
|
||
client.select(cfg.db)
|
||
/** 全局变量 redis */
|
||
global.redis = client
|
||
|
||
logger.mark('连接redis成功')
|
||
|
||
return client
|
||
}
|
||
|
||
async function aarch64 () {
|
||
let tips = ''
|
||
/** 判断arch */
|
||
let arch = await execSync('arch')
|
||
if (arch.stdout && arch.stdout.includes('aarch64')) {
|
||
/** 判断redis版本 */
|
||
let v = await execSync('redis-server -v')
|
||
if (v.stdout) {
|
||
v = v.stdout.match(/v=(\d)./)
|
||
/** 忽略arm警告 */
|
||
if (v && v[1] >= 6) tips = ' --ignore-warnings ARM64-COW-BUG'
|
||
}
|
||
}
|
||
tips = ' --ignore-warnings ARM64-COW-BUG'
|
||
return tips
|
||
}
|
||
|
||
/** 尝试自动启动redis */
|
||
async function startRedis (cmd, client, redisUrl) {
|
||
logger.mark('尝试启动redis')
|
||
await execSync(cmd)
|
||
await common.sleep(500)
|
||
try {
|
||
/** 重新链接 */
|
||
client = createClient({ url: redisUrl })
|
||
await client.connect()
|
||
} catch (error) {
|
||
let err = error.toString()
|
||
logger.mark(err)
|
||
logger.error('请先开启Redis')
|
||
logger.error(`redis启动命令:${cmd}`)
|
||
process.exit()
|
||
}
|
||
return client
|
||
}
|
||
|
||
async function execSync (cmd) {
|
||
return new Promise((resolve, reject) => {
|
||
exec(cmd, (error, stdout, stderr) => {
|
||
resolve({ error, stdout, stderr })
|
||
})
|
||
})
|
||
}
|