Jak już doświadczony (widziałem, że stworzyliśmy issue in GitHub kilka dni temu) wsparcie SendBird jest trochę niewiarygodne.
Fakt, że oferują one just a minified version ich SDK JavaScript (który osobiście uważam za bardzo słaby) pomaga albo.
Zresztą mogę odizolować createChannelWithUserIds
funkcję:
! 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
});
Używasz funkcję tak:
createChannelWithUserIds(o, n, t, r, a, s);
Więc czwarty parametr (r
) jest coverURL
: plik z pokrywą obraz (this.groupPhotoFile
);
Jego walidacja jest w zasadzie powiedzieć, że:
"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
że parametr jest nieprawidłowy.
Plik nie jest ciągiem znaków, nie jest pusta i nie niezdefiniowane, więc wszystko sprowadza się do h()
funkcję:
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({})
}
Funkcja powyżej czeku na pierwszym miejscu, jeśli obiekt ma żadnego majątku, co jest członkiem samego obiektu (tj. nie należących do łańcucha prototypów). Następnie, jeśli nie ma żadnej własnej właściwości, sprawdza, czy obiekt/tablica stringify jest równy pustemu obiektowi/tablicy.
Nie mogę powiedzieć, co jest intencją twórców podczas sprawdzania poprawności plików choć tej funkcji, ale standard obiektu File:
- ma właściwości w łańcuchu prototypów, ale nie bezpośrednio przypisane do instancji, więc pierwszym warunkiem jest
true
.
- kiedy stringify zwraca pusty obiekt we wszystkich głównych przeglądarkach w dzisiejszych czasach (it was not always like so), więc drugim warunkiem jest również
true
.
Jak widzieliśmy wcześniej, musimy h()
wrócić false
: sprawdzanie poprawności nie powiedzie się, jeśli zwraca true
.
Aby rozwiązać ten problem można zmienić funkcję h()
do czegoś podobnego:
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)
}
ale nie będę z nim bałagan. Może być stosowany w przyszłych wersjach o innym celu.
Dlatego najlepiej jest, aby zmienić funkcję createChannelWithUserIds()
do:
- usunąć wywołanie funkcji
h()
z walidacji.
- wymienić go na wezwanie do własnego walidacji plików
Aby to zrobić, można zastąpić funkcję w SendBird przykład:
var sb = new SendBird({ appId: ... });
sb.GroupChannel.createChannelWithUserIds = function(){ ... };
Ale to nie ma gwarancji, do pracy i może pęknąć w przyszłych wydaniach, więc po prostu edytowałbym plik SendBird.min.js. Innymi słowy, należy wymienić:
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);
z:
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);
w obecnej wersji (v3.0.41) znajdziesz dwa zbiegi okoliczności kodu powyżej: jeden dla createChannel
i inne dla createChannelWithUserIds
, możesz wymienić oba.
Oczywiście edycja pliku .js jest denerwująca, ponieważ trzeba będzie uważać, aby zastąpić kod za każdym razem, gdy uaktualnisz SendGrid. Można utworzyć automatyczne zadanie wewnątrz rurociągu CI, aby zrobić to za Ciebie, pomyślał.
Mam nadzieję, że programiści SendGrid potwierdzą twój problem i naprawią go w przyszłej wersji.
Którą wersję zestawu SDK używasz? – David
Używam wersji 3.0.40 –
Czy jesteś szczęśliwszy używając [Platform API] (https://docs.sendbird.com/platform#open_channel_3_create_a_channel)? Zauważ, że, jak możesz przeczytać w dokumentach, musisz wysłać [Multipart request] (https://docs.sendbird.com/platform#quick_start_4_multipart_requests). Jeśli możesz wysłać plik za pomocą REST API, być może możliwe jest zastąpienie sprawdzenia js, które zwraca błąd 800110. – David