* 保存到文件(MERGE 语义) * partial save(仅 token、proxy、stats)不应覆盖未传字段——保留 existing 值 * @private
(email, accountData)
| 220 | const { parseAccountLine } = require('./account-parser') |
| 221 | const accountTokens = process.env.ACCOUNTS.split(',') |
| 222 | const accounts = [] |
| 223 | |
| 224 | // 解析委托给共用 parser,与后台批量添加保持一致; |
| 225 | // 注意:这里仅加载凭据,token 在 Account 类中按需登录获取 |
| 226 | for (const item of accountTokens) { |
| 227 | const parsed = parseAccountLine(item) |
| 228 | if (parsed) { |
| 229 | accounts.push({ ...parsed, token: null, expires: null }) |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | return accounts |
| 234 | } |
| 235 | |
| 236 | /** |
| 237 | * 保存到 Redis |
| 238 | * @private |
| 239 | */ |
| 240 | async _saveToRedis(email, accountData) { |
| 241 | return await redisClient.setAccount(email, accountData) |
| 242 | } |
| 243 | |
| 244 | /** |
| 245 | * 保存到文件(MERGE 语义) |
| 246 | * partial save(仅 token、proxy、stats)不应覆盖未传字段——保留 existing 值 |
| 247 | * @private |
| 248 | */ |
| 249 | async _saveToFile(email, accountData) { |
| 250 | return enqueueFileTask(async () => { |
| 251 | const data = await this._readDataFile() |
| 252 | |
| 253 | if (!data.accounts) { |
| 254 | data.accounts = [] |
| 255 | } |
| 256 |
no test coverage detected