uni-app 69发送消息接口开发-单聊
Posted 2019ab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uni-app 69发送消息接口开发-单聊相关的知识,希望对你有一定的参考价值。
app/controller/chat.js
// app/controller/chat.js
const Controller = require('egg').Controller;
class ChatController extends Controller {
// 连接socket
async connect() {
const { ctx, app } = this;
if (!ctx.websocket) {
ctx.throw(400,'非法访问');
}
// console.log(`clients: ${app.ws.clients.size}`);
// 监听接收消息和关闭socket
ctx.websocket
.on('message', msg => {
// console.log('接收消息', msg);
})
.on('close', (code, reason) => {
// 用户下线
console.log('用户下线', code, reason);
let user_id = ctx.websocket.user_id;
if (app.ws.user && app.ws.user[user_id]) {
delete app.ws.user[user_id];
}
});
}
// 发送消息
async send(){
const {ctx,app,service} = this;
// 用户id
let current_user_id = ctx.authUser.id;
// 验证参数
ctx.validate({
to_id:{
type:'int',
require:true,
desc:'接收人/群id'
},
chat_type:{
type:'string',
require:true,
range:{in:['user','group']},
desc:'接收类型'
},
type:{
type:'string',
require:true,
range:{in:['text','image','video','audio']},
desc:'消息类型'
},
data:{
type:'string',
require:true,
desc:'消息内容'
}
});
// 获取参数
let {to_id,chat_type,type,data} = ctx.request.body;
// 单聊
if(chat_type=='user'){
// 验证好友是否存在,并且对方没有把你拉黑
let Friend = await app.model.Friend.findOne({
where:{
user_id:to_id,
friend_id:current_user_id,
isblack:0
},
include:[{
model:app.model.User,
as:'userInfo'
},{
model:app.model.User,
as:'friendInfo'
}]
});
if(!Friend){
return ctx.apiFail('对方不存在或者已把你拉黑');
}
// 验证好友是否被禁用
if(!Friend.userInfo.status){
return ctx.apiFail('对方已经被禁用');
}
// 构建消息格式
let from_name = Friend.friendInfo.nickname ? Friend.friendInfo.nickname : Friend.friendInfo.username;
if(Friend.nickname){
from_name = Friend.nickname;
}
let message = {
id:(new Date()).getTime(), // 唯一id,后端生成唯一id
from_avatar:Friend.friendInfo.avatar,// 发送者头像
from_name,// 发送者昵称
from_id:current_user_id, // 发送者id
to_id,// 接收人id
to_name:Friend.userInfo.nickname ? Friend.userInfo.nickname : Friend.userInfo.username,// 接收人/群 名称
to_avatar:Friend.userInfo.avatar,// 接收人/群 头像
chat_type:'user', // 接收类型
type, // 消息类型
data, // 消息内容
options:{}, // 其他参数
create_time:(new Date()).getTime(),// 创建时间
isremove:0 // 是否撤回
}
// 拿到当前的socket
let socket = app.ws.user[to_id];
// 验证对方是否在线,不在线记录到待接收消息队列中 在线:消息推送 存储到对方的聊天记录中 chatlog_对方用户id_user_当前用户id
if(!socket){
service.cache.setList('getmessage_'+to_id,message);
}else{
// 消息推送
socket.send(JSON.stringify({
msg:'ok',
data:message
}))
// 存到历史记录中
service.cache.setList(`chatlog_${to_id}_user_${current_user_id}`,message);
}
// 存储到自己的聊天记录中
service.cache.setList(`chatlog_${current_user_id}_user_${to_id}`,message);
// 返回成功
return ctx.apiSuccess(message);
}
// 验证
}
}
module.exports = ChatController;
以上是关于uni-app 69发送消息接口开发-单聊的主要内容,如果未能解决你的问题,请参考以下文章