ctx响应结构的设计(koa)

27 阅读1分钟

前言:koa的接口一定要有响应,否则前端请求会报404的错

async function sendFeiShuMsg(ctx) {
    try {
        // 1. 验证请求数据
        if (!ctx || !ctx.request || !ctx.request.body) {
            ctx.status = 400;
            ctx.body = {
                code: 400,
                success: false,
                message: '请求参数错误',
                data: null
            };
            return;
        }

        const taskData = ctx.request.body;
        
        // 2. 验证必要字段

        if (!taskData.name || !taskData.content) {
            ctx.status = 400;
            ctx.body = {
                code: 400,
                success: false,
                message: '缺少任务名称或内容',
                data: null
            };
            return;
        }

        // 3. 获取飞书 token
        const tenant_access_token = await getTenantToken();

        if (!tenant_access_token) {
            ctx.status = 500;
            ctx.body = {
                code: 500,
                success: false,
                message: '获取飞书Token失败',
                data: null
            };
            return;
        }

        // 4. 获取 open_id
        const openData = await getOpenId(taskData.selectedStaff.phone);
        let open_id = openData.data.user_list[0].user_id;

        // 5. 构建消息内容
        let content = JSON.stringify({
            type: `template`,
            data: {
                template_id: "AAqXJFCUdYjOM", // 卡片模板id
                template_variable: { // 卡片绑定的变量
                    "title": `${taskData.name}`,
                    "content": `您有一个待点检任务,${taskData.content}`,
                    "tourl": {
                        "url": `http://oa.jt-ele.com:9527/task-inspection-front/`
                    },
                    "open_id": taskData.selectedStaff.open_id || open_id
                },
            },
        });

        // 6. 发送飞书消息
        const result = await client.im.v1.message.create({
            params: {
                receive_id_type: 'open_id',
            },
            data: {
                receive_id: open_id,
                msg_type: 'interactive',
                content,
            },
        }, lark.withTenantToken(tenant_access_token));

        // 7. 成功响应
        ctx.status = 200;
        ctx.body = {
            code: 200,
            success: true,
            message: '飞书消息发送成功',
            data: {
                message_id: result.data.message_id,
                open_id: open_id,
                send_time: new Date().toISOString()
            }
        };

    } catch (error) {
        // 8. 错误响应
        ctx.status = 500;
        ctx.body = {
            code: 500,
            success: false,
            message: `发送飞书消息失败: ${error.message || '未知错误'}`,
            data: null,
            error: process.env.NODE_ENV === 'development' ? error.stack : undefined
        };
    }
}