0

我目前正在尝试使用 SendBird SDK,并且一直在尝试调用此函数并在我这样做时返回错误。以下是他们在文档中提供的方法。

channel.sendUserMessage(message, data, customType, function(message, error){
    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
});

这是我使用的:

channelList[i].sendUserMessage(message, function (message, error) {

    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
    document.getElementById(url + "ChatInput").value = "";

});

我回来的错误是这样的:

I {name: "SendBirdException", code: 900025, message: "Message is blocked due to invalid type of 'mentioned_user_ids'"}
code: 900025
message: "Message is blocked due to invalid type of 'mentioned_user_ids'"
name: "SendBirdException"

现在我只上传一个字符串,一开始真的很困惑提到的_users_ids 是从哪里来的,但我知道了原因。我相信在 SendBird SDK 中,他们使用 Typescript 和基于此文件的不同参数的多个重载:

https://github.com/smilefam/SendBird-SDK-JavaScript/blob/master/SendBird.d.ts

特别是该文件中的这一部分:

sendUserMessage(userMessageParams: UserMessageParams, callback: messageCallback): UserMessage;
sendUserMessage(message: string, callback: messageCallback): UserMessage;
sendUserMessage(message: string, data: string, callback: messageCallback): UserMessage; // DEPRECATED
sendUserMessage(message: string, data: string, customType: string, callback: messageCallback): UserMessage; // DEPRECATED
sendUserMessage(
   message: string,
   data: string,
   customType: string,
   targetLanguages: Array<string>,
   callback: messageCallback
): UserMessage;

我相信,因为我没有使用 Typescript,所以我相信它默认为该列表中使用 userMessageParams 的第一个函数,其中包括:

interface UserMessageParams {
    message: string;
    data: string;
    customType: string;
    targetLanguages: Array<string>;
    mentionType: 'users' | 'channel';
    mentionedUserIds: Array<string>;
    mentionedUsers: Array<User>;
    pushNotificationDeliveryOption: 'default' | 'suppress';
}

其中包括之前在错误中提到的属性,即“提到的用户 ID”。

我的问题是是否可以将其默认为仅字符串和回调函数的简单重载:

sendUserMessage(message: string, callback: messageCallback): UserMessage;

代替:

sendUserMessage(userMessageParams: UserMessageParams, callback: messageCallback): UserMessage;

不使用打字稿。

我试过的

我试图通过以下方式自己制作对象:

var userMessageParams = new sb.UserMessageParams();
userMessageParams.message = message;
userMessageParams.mentionType = "channel";

channelList[i].sendUserMessage(userMessageParams, function (message, error) {
    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
    document.getElementById(url + "ChatInput").value = "";
});

但我仍然得到与上述相同的错误。

null_data:null
_mentionType:"channel"
_mentionedIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUserIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUsers:[]
_message:"message"
_pushNotificationDeliveryOption:null
_targetLanguages:null

我在 userMessageParams 中手动设置了属性的值:

userMessageParams.mentionedUserIds = [ channelList[0].members[1].userId, channelList[0].members[0].userId];

_customType:null
_data:null
_mentionType:"channel"
_mentionedIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUserIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUsers:[]
_message:"message"
_pushNotificationDeliveryOption:null
_targetLanguages:null

//Inside console in Chrome
channelList[0].members[1].userId
"d155d9e51f3e4897988e39a8f33c89a6"

channelList[0].members[0].userId
"1924c64299284da6b8e6366a7f0b7a7c"

(我不知道为什么它只在userIds中添加了其中一个,我在添加它之前和之后验证了两者在控制台中都有值。如果它与后台的senderId相同或者那就是可能不会添加值最好的猜测)我仍然得到同样的错误。

我不想提及某些用户,因为这只是用于 1 对 1 聊天,所以我真的不需要它。

解决方案

我现在看到的两种可能的解决方案是:

  • 弄清楚谁默认使用字符串重载(我从未使用过 Typescript,也不知道它是如何转编译为 java-script 的,所以我不知道这是否可能)。
  • 弄清楚我在哪里搞砸了 userMessageParams,我什至不想提及任何用户。

很抱歉这篇文章,如果有人有任何信息可以帮助我或需要更多澄清来帮助我,任何事情都将不胜感激,谢谢

转译代码

...如果有人足够疯狂地看这个(或我认为的)位于 SendBird.min.js 中):

this.sendUserMessage = function(e, n, t, r, i) {
                var a = this
                  , s = le.MentionType.USERS
                  , o = []
                  , l = ue.PushNotificationDeliveryOption.DEFAULT;
                if ("function" == typeof n && (i = n,
                n = "",
                t = "",
                r = [],
                e instanceof ue)) {
                    var u = e;
                    e = u.message,
                    n = u.data,
                    t = u.customType,
                    r = u.targetLanguages,
                    s = u._mentionType,
                    o = u._mentionedIds,
                    l = u.pushNotificationDeliveryOption ? u.pushNotificationDeliveryOption : ue.PushNotificationDeliveryOption.DEFAULT
                }
                if ("function" == typeof t && (i = t,
                t = "",
                r = []),
                "function" == typeof r && (i = r,
                r = []),
                r || (r = []),
                "string" == typeof r && (r = [r]),
                null === n && (n = ""),
                null === t && (t = ""),
                "string" != typeof e || "string" != typeof n || "string" != typeof t || !Array.isArray(r) || [ue.PushNotificationDeliveryOption.DEFAULT, ue.PushNotificationDeliveryOption.SUPPRESS].indexOf(l) < 0)
                    return void U(null, new I("Invalid parameter.",C.INVALID_PARAMETER), i);
                var c = null;
                if (!he.getInstance() || !he.getInstance().currentUser)
                    return i && U(null, new I("Connection should be made first.",C.CONNECTION_REQUIRED), i),
                    c;
                var d = q.bMessage(this.url, e, n, t, s, o, r, l)
                  , h = M.build(d.requestId, 0, he.getInstance().currentUser, this, e, n, t, r, (new Date).getTime(), null, s, null, o);
                return c = new M(h),
                he.getInstance().sendCommand(d, function(e, n) {
                    if (n)
                        return void U(null, new I(n.message,n.code), i);
                    var t = new M(e.getJsonElement())
                      , r = he.getInstance().currentUser;
                    r && t._sender && r.userId === t._sender.userId && (r.nickname !== t._sender.nickname && (r.nickname = t._sender.nickname),
                    r.profileUrl !== t._sender.profileUrl && (r.profileUrl = t._sender.profileUrl)),
                    a.isGroupChannel() && F.getChannel(a.url, function(e, n) {
                        if (R) {
                            var r = e;
                            e = n,
                            n = r
                        }
                        if (n)
                            return void U(null, n, i);
                        e.lastMessage = t;
                        for (var a in he.getInstance().channelHandlers) {
                            he.getInstance().channelHandlers[a].onChannelChanged(e)
                        }
                    }),
                    U(t, null, i)
                }),
                c
            }
4

1 回答 1

0

SendBird 不使用 TypeScript。接口文件就是用它写的。 https://github.com/smilefam/SendBird-SDK-JavaScript/blob/master/SendBird.d.ts 里面,是vanilla JS。

您上面提到的代码应该可以在不需要定义UserMessageParam的情况下工作。

    channelList[i].sendUserMessage(message, function (message, error) {

        if (error) {
            console.error(error);
            return;
        }

        console.log(message);
        document.getElementById(url + "ChatInput").value = "";

    });

请尝试调试单步执行。另外,请检查具有类似实现的示例代码。https://github.com/smilefam/SendBird-JavaScript

于 2018-09-28T05:25:48.390 回答