'use strict'; /** * 推送云函数 * 支持单推(cid)和群推(cids) */ exports.main = async (event, context) => { // HTTP 触发器接收的参数在 event.body 中(JSON 字符串),需要解析 let requestData; if (event.body && typeof event.body === 'string') { try { requestData = JSON.parse(event.body); console.log('成功解析 event.body'); } catch (e) { console.error('JSON 解析失败:', e.message); return { success: false, error: { code: 'ParseError', message: '请求体 JSON 格式错误' } }; } } else if (event.body && typeof event.body === 'object') { // 某些情况下 body 可能已经是对象 requestData = event.body; console.log('使用 event.body 对象'); } else { // 兼容直接传递参数的情况(非 HTTP 触发器调用或测试环境) requestData = event; console.log('使用 event 对象(兼容模式)'); } console.log('请求数据:', JSON.stringify(requestData)); // 从解析后的数据中解构参数 const { appId, cids, cid, title, content, payload, request_id } = requestData; // 参数校验 if (!appId || typeof appId !== 'string') { console.error('appId 无效:', appId, '类型:', typeof appId); return { success: false, error: { code: 'ParameterError', message: '缺少必填参数:appId,且必须为字符串' } }; } // 统一推送目标:cid 优先,其次 cids const clientIds = cid ? [cid] : cids; if (!clientIds || (Array.isArray(clientIds) && clientIds.length === 0)) { console.error('clientIds 无效:', clientIds); return { success: false, error: { code: 'ParameterError', message: '缺少必填参数:cids 或 cid' } }; } if (!title || typeof title !== 'string') { console.error('title 无效:', title); return { success: false, error: { code: 'ParameterError', message: '缺少必填参数:title,且必须为字符串' } }; } if (!content || typeof content !== 'string') { console.error('content 无效'); return { success: false, error: { code: 'ParameterError', message: '缺少必填参数:content,且必须为字符串' } }; } // 发送推送 try { console.log('初始化推送管理器,appId:', appId); const uniPush = uniCloud.getPushManager({ appId }); const sendMessageParams = { push_clientid: Array.isArray(clientIds) ? clientIds : [clientIds], title, content, force_notification: true // 离线厂商推送必填 }; // 自定义 payload(仅当为有效对象时添加) if ( payload && typeof payload === 'object' && !Array.isArray(payload) && Object.keys(payload).length > 0 ) { sendMessageParams.payload = payload; console.log('添加自定义 payload'); } // 可选的 requestId if (request_id) { sendMessageParams.request_id = request_id; console.log('添加 request_id:', request_id); } console.log('准备发送推送,参数:', JSON.stringify(sendMessageParams)); const res = await uniPush.sendMessage(sendMessageParams); console.log('推送成功,结果:', JSON.stringify(res)); return { success: true, data: res }; } catch (error) { // 记录完整错误信息到云函数日志,便于排查 console.error('push-send 推送失败:', JSON.stringify({ message: error.message, errMsg: error.errMsg, code: error.code, stack: error.stack })); return { success: false, error: { code: error.code || 'PushError', message: error.errMsg || error.message || '推送失败,请稍后重试' } }; } };