SendBird用文件作为封面创建GroupChannel

我正在尝试用封面照片创建一个组频道,

this.sendBirdInstance.GroupChannel.createChannelWithUserIds(userIds, true, this.groupName, this.groupPhotoFile, '', function (createdChannel, error) {
...
}

根据文档,我可以添加一个url或一个文件

coverUrl:封面图片的文件或URL,您可以将其提取到UI中。

但是当添加文件时,我总是得到: "SendBirdException", code: 800110, message: "Invalid arguments."

有没有办法用文件而不是url创建一个组(因为我想让用户上传文件)?

谢谢,


正如你已经经历的(我看到你几天前在GitHub中创建了一个问题),SendBird的支持有点不可靠。

事实上,他们提供的只是他们的JavaScript SDK的缩小版本(我个人觉得很差),这两者都有帮助。

无论如何,我可以隔离createChannelWithUserIds函数:

! function (e, n) {
    // ... 
}(this, function () {
    // ... 
    var h = function (e) {
        for (var n in e) if (e.hasOwnProperty(n)) return !1;
        return Array.isArray(e) ? JSON.stringify(e) === JSON.stringify([]) : JSON.stringify(e) === JSON.stringify({})
    },
    // ... 
    A = function () { // it returns SendBird function
        // ... 
        var w = function (e) { // w is this.GroupChannel
            // ... 
            w.createChannelWithUserIds = function () {
                // ...
                // here comes the param validation (I've added spaces for a better lecture):
                if (!Array.isArray(e) || "boolean" != typeof n || "string" != typeof t && null !== t && void 0 !== t || "string" != typeof r && h(r) && null !== r && void 0 !== r || "string" != typeof a && null !== a && void 0 !== a || "string" != typeof i && null !== i && void 0 !== i) return void U(null, new p("Invalid arguments.", J.INVALID_PARAMETER), s);
                // It will return "Invalid arguments." if any of the conditions evaluates to true       
                // ... 
            }
        }
    }
    return function () {
        // ... 
    }().SendBird
});

你正在使用这样的功能:

createChannelWithUserIds(o, n, t, r, a, s); 

所以第四个参数( r )是coverURL :带有封面图片的文件( this.groupPhotoFile );

其验证基本上是这样说的:

"string" != typeof r    // if `r` is not a string (a URL)
&& h(r)                 // and the returned value of function h(r) is true
&& null !== r           // and it is not null
&& void 0 !== r         // and it is not undefined

该参数无效。

你的文件不是一个字符串,不是null,也不是未定义的,所以一切都归结为h()函数:

var h = function (e) {
    for (var n in e) if (e.hasOwnProperty(n)) return !1;
    return Array.isArray(e) ? JSON.stringify(e) === JSON.stringify([]) : JSON.stringify(e) === JSON.stringify({})
}

上面的函数首先检查对象是否具有属性对象本身的成员(即不属于原型链的属性)。 然后,如果它没有任何属性,它会检查stringify对象/数组是否等于一个空的对象/数组。

我不能说通过这个函数验证文件时开发人员的意图是什么,而是一个标准的FILE对象:

  • 在其原型链中有属性,但没有直接分配给实例,所以第一个条件是true
  • 当stringify在当今所有主流浏览器中都返回一个空对象时(它并不总是这样),所以第二个条件也是true
  • 正如我们前面看到的,我们需要h()返回false :如果验证返回true则验证失败。

    为了解决这个问题,你可以把h()函数改成如下所示:

    var h = function( e ){
        return !(e instanceof File);
        // or return e.constructor != File;
        // or return Object.getPrototypeOf( e ) != File.prototype );
        // or return e.__proto__ != File.prototype )
        // or return e.constructor.prototype != File.prototype )
    }
    

    但我不会惹它。 它可以在未来的版本中用于不同的目的。

    所以最好的选择是将createChannelWithUserIds()函数更改为:

  • 从验证中移除对h()函数的调用。
  • 将其替换为您自己的文件验证的调用
  • 为此,您可以重写SendBird实例中的函数:

    var sb = new SendBird( { appId: ... } );
    
    sb.GroupChannel.createChannelWithUserIds = function(){ ... };
    

    但它不能保证工作,并可能在未来的版本中打破,所以我只编辑SendBird.min.js文件。 换句话说,替换:

    if(!Array.isArray(e)||"boolean"!=typeof n||"string"!=typeof t&&null!==t&&void 0!==t||"string"!=typeof r&&h(r)&&null!==r&&void 0!==r||"string"!=typeof a&&null!==a&&void 0!==a||"string"!=typeof i&&null!==i&&void 0!==i)return void U(null,new p("Invalid arguments.",J.INVALID_PARAMETER),s);
    

    有:

    if(!Array.isArray(e)||"boolean"!=typeof n||"string"!=typeof t&&null!==t&&void 0!==t||"string"!=typeof a&&null!==a&&void 0!==a||"string"!=typeof i&&null!==i&&void 0!==i)return void U(null,new p("Invalid arguments.",J.INVALID_PARAMETER),s);
    

    在当前版本(v3.0.41)中,您会发现以上代码的两个巧合:一个用于createChannel ,另一个用于createChannelWithUserIds ,您可以替换两者。

    当然,编辑.js文件很烦人,因为每次升级SendGrid时都需要注意替换代码。 想象中,你可以在你的CI管道中创建一个自动任务来为你做。

    希望SendGrid开发人员能够承认你的问题,并在未来的版本中修复它。

    链接地址: http://www.djcxy.com/p/40455.html

    上一篇: SendBird create GroupChannel with file as cover

    下一篇: How to pass a param to HttpInterceptor?