Vk-io: [bug] vk.api mengirimkan parameter yang sama dengan yang tidak ditentukan

Dibuat pada 27 Agu 2020  ·  18Komentar  ·  Sumber: negezor/vk-io

Hai!
Singkatnya, memanggil API apa pun dengan parameter yang secara eksplisit menentukan nilai undefined mengarah pada fakta bahwa itu ditransfer ke VK. Di bawah ini adalah contoh.

Apa yang kamu lakukan?

await ctx.send("it'll fail", {
    keyboard: undefined
});

ctx - konteks acara message_new

Снимок экрана 2020-08-28 в 00 53 43

Apa yang Anda harapkan terjadi?

Parameter dengan nilai undefined tidak boleh dilewatkan, sama persis seperti jika dihilangkan.

Apa hasil sebenarnya?

VK-IO menerjemahkan undefined menjadi string dan memberikannya ke server.

Versi

| paket | versi |
| ---------------------------------- | ------- |
| vk-io | 4.0.1 |
| node | 12.17.0 |
| TypeScript | 4.0.2 |
| yarn | 1.22.4 |

vk-io

Semua 18 komentar

Tidak, tunggu, itu tidak bekerja seperti itu sedikit. Jelaskan kepada Anda?

Ayolah, ada apa sedikit?

Bahwa parameter dikirim menggunakan URLSearchParams

const params = {
   message: 'hello',
   keyboard: undefined
};

console.log(new URLSearchParams(params));
// Выведет: URLSearchParams { 'message' => 'hello', 'keyboard' => 'undefined' }

@isinkin Ya, tapi saya sudah menulis di PR bahwa ini adalah bug, karena TypeScript tidak membuat perbedaan sama sekali, parameter tidak ditentukan atau ditentukan dengan nilai undefined , tetapi pada saat runtime ini sudah mengarah ke kesalahan API. Ini adalah semacam perangkap langsung.

@zardoy mengapa ini bug?

const obj = {
  key: undefined,
}

const properties = Object.getOwnPropertyNames(obj)

console.log(properties)

Properti dideklarasikan, tipenya tidak ditentukan, dan ketika dikonversi ke string, string 'tidak terdefinisi' diperoleh.
Fakta bahwa sesuatu tidak bekerja dengan baik untuk ts sudah berlaku untuk ts, runtime pada v8, sebagai aturan, dan hanya mendukung javascript.

const obj = {
  key: undefined,
}

const properties = Object.getOwnPropertyNames(obj)

console.log(properties)

Itu benar, tetapi mengapa transformasi ini? Lagi pula, jika kita ingin secara eksplisit meneruskan string dengan konten seperti itu, mengapa tidak secara eksplisit meneruskan string sebagai parameter?

vk.api.messages.send({
    message: "undefined" // - так ок
});

Mungkin Anda benar bahwa ini bukan bug, tetapi hanya jebakan karena fakta bahwa ts tidak menimbulkan kesalahan kompilasi ketika Anda secara eksplisit menentukan undefined . Namun, saran saya di PR adalah bahwa perilaku ketika kita menghilangkan parameter sepenuhnya dan menentukan undefined akan sama, karena tidak selalu

Sori, yang saya tutup, sekarang saya tambahkan.

@zardoy saya mengerti apa yang anda maksud.

Tentunya Anda menulis sesuatu seperti

let someVariable;

const query = {
  key: someVariable,
}

send(query)

Saya pikir masalah ini ada di pihak pengguna, Anda perlu menulis dengan cara yang berbeda, dan dengan pr ini Anda merusak kompatibilitas ke belakang.

Saya pikir masalah ini ada di pihak pengguna, Anda perlu menulis dengan cara yang berbeda, dan dengan pr ini Anda merusak kompatibilitas ke belakang.

Saya setuju.

Lihat saja di mana anjing itu dikuburkan (contoh yang lebih ilustratif):

  • Saya tidak bisa mengejanya seperti itu
    Снимок экрана 2020-08-28 в 13 39 24

  • Saya sudah bisa melakukan ini
    Снимок экрана 2020-08-28 в 13 39 59

ts akan bersumpah dengan baik, meskipun permintaan sebenarnya akan sama. Hanya jebakan bagi pengguna

@zardoy jadi jangan menulis apa pun jika Anda tidak ingin melewatkan parameter ini, itu akan berfungsi seperti yang Anda inginkan

vk.api.messages.send()

Ada agak ketidakcocokan perilaku, dengan JSON.stringify() undefined akan terlewatkan. Sementara URLSearchParams mengarahkan semuanya ke string. Ini tidak akan merusak kompatibilitas mundur, karena yang dicentang adalah undefined , bukan "undefined" .

Tapi sekarang kita akan kehilangan pesan menarik di chat berupa undefined :)

@negezor tentang pesan seperti yang saya maksud, ada kemungkinan seseorang menggunakan tipe yang tidak ditentukan ketika mereka ingin mencetak teks seperti itu)

upd: yah, alih-alih tidak terdefinisi, pengecualian akan dilemparkan dalam beberapa kasus, misalnya, ketika pesan kosong.

Mengapa Anda menentukan undefined dalam parameter sama sekali?

Indikasi eksplisit adalah contoh sederhana untuk tujuan pemahaman saja. Pada kenyataannya, nilai ini dapat berasal dari suatu fungsi, ketika objek digabungkan, dan dari banyak hal lainnya. Berikut ini contoh dari PR:

await ctx.send("Hey` there!", {
    keyboard: await getKeyboardToSend() //undefined | KeyboardBuilder - соответствие типов, но ошибка ругается API
});

Di sini saya menggunakannya sebagai tipe fallback, yang berarti Anda tidak perlu menampilkan keyboard

Fakta bahwa URLSearchParams mengumpulkan undefined mungkin lebih fleksibel dan benar, tetapi kurang nyaman.

Saya tidak tahu banyak tentang vkapi dan sumber daya lib ini dan saya tidak bisa mengatakan apakah ada masalah, tetapi jika memang ada masalah perilaku yang berbeda dalam satu perpustakaan, maka ini harus diselesaikan.

Saya kira Anda dapat meneruskan isi permintaan secara langsung dan itu dikonversi ke JSON menggunakan JSON.stringify, yang memotong tidak terdefinisi tidak seperti URLSearchParams, ini membingungkan bagi pengguna.

Fakta bahwa URLSearchParams mengumpulkan undefined mungkin lebih fleksibel dan benar, tetapi kurang nyaman.

@talentumtuum tidak begitu setuju, saya bahkan dapat memberikan contoh dari lib lain yang sangat besar.
Ada perpustakaan prisma seperti itu (melaluinya Anda dapat membuat kueri ke database). Dan inilah salah satu contohnya:

const hisNotes = await prisma.userNote.findMany({
    where: {
        userName: "Dmitriy" // вернет записки только дмитрия
    }
});
const allNotes = await prisma.userNote.findMany({
    where: {
        userName: undefined // не вернет записки пользователя "undefined"
    }
});
// это равносильно
allNotes = await prisma.userNote.findMany({ });

upd: yah, alih-alih tidak terdefinisi, pengecualian akan dilemparkan dalam beberapa kasus, misalnya, ketika pesan kosong.

Saya setuju, bayangkan saja jika bot spam "tidak terdefinisi" pada perintah apa pun. Pengecualian yang lebih baik daripada omong kosong diam xd

upd: mungkin mereka setidaknya akan melihatnya di log, tetapi mereka akan memperbaikinya

Tetap saja, saya pikir bug lebih baik daripada posting yang bermasalah. Dalam alat seperti Sentry, sulit untuk melacak apa yang bukan bug. Versi utama 4 ditujukan untuk interaksi yang lebih baik dengan perpustakaan dan undefined eksplisit tidak.

Ini juga memperbaiki perilaku yang tidak jelas antara URLSearamParams dan JSON.stringify() , diperbaiki di https://github.com/negezor/vk-io/commit/1026d333a07ff50423100f331e74a8041e2f567d , diposting di 4.0.2

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

nitreojs picture nitreojs  ·  3Komentar

alexey2baranov picture alexey2baranov  ·  8Komentar

SOS
helix-team picture helix-team  ·  4Komentar

Jengas picture Jengas  ·  15Komentar

AndreiSoroka picture AndreiSoroka  ·  6Komentar