-
Notifications
You must be signed in to change notification settings - Fork 86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[bug] vk.api отправляет параметры, равные undefined #321
Comments
Нет, постой, это не так работает немножко. Тебе объяснить? |
Ну давай, что немножко не так? |
То, что параметры отправляются с помощью URLSearchParams const params = {
message: 'hello',
keyboard: undefined
};
console.log(new URLSearchParams(params));
// Выведет: URLSearchParams { 'message' => 'hello', 'keyboard' => 'undefined' } |
@isinkin Да, но я в PR уже написал, что это именно баг, тк TypeScript вообще без разницы параметр не указан или указан со значением |
@zardoy почему это баг? const obj = {
key: undefined,
}
const properties = Object.getOwnPropertyNames(obj)
console.log(properties) Свойство объявлено, его тип - undefined и при его преобразовании в строку получается строка 'undefined'. |
Все верно, но только зачем это преобразование? Ведь если мы хотим явно передать строку с таким контентом, почему явно не передать строку в качестве параметра? vk.api.messages.send({
message: "undefined" // - так ок
}); Возможно ты прав, что это не баг, а просто подводный камень из-за того, что ts не выкидывает ошибку компиляции при явном указании |
Сори, что закрыл, сейчас дополню. |
@zardoy я понимаю о чем ты. Наверняка ты пишешь что-то вроде let someVariable;
const query = {
key: someVariable,
}
send(query) Я считаю эта проблема на стороне пользователя, писать нужно по-другому, а этим pr-ом ты ломаешь обратную совместимость. |
Согласен. Просто вот смотри где собака зарыта (более наглядный пример):
ts ругаться ну будет, хотя запрос по факту будет таким же. Просто подводный камень для пользователя |
@zardoy так ты ничего не пиши если не хочешь передавать этот параметр, будет работать так как ты хочешь vk.api.messages.send() |
Тут скорее несовпадение поведений, при Но теперь мы потеряем интересные сообщения в чате в виде |
@negezor про такие сообщения я и имел ввиду, не исключено что кто-то использует тип undefined когда хочет напечатать такой текст) upd: ну, а вместо undefined будет вылетать exception в некоторых случаях, например когда сообщение пустое. |
А зачем вы вообще указываете в параметрах undefined? |
Явное указание — упрощенный пример, лишь для понимания. В реальности же это значение может приходить из функции, при слиянии объектов, и много откуда еще. Вот пример из PR: await ctx.send("Hey` there!", {
keyboard: await getKeyboardToSend() //undefined | KeyboardBuilder - соответствие типов, но ошибка ругается API
}); Здесь использую как резервной тип, который бы означал то, что не нужно показывать клавиатуру |
То что URLSearchParams собирает undefined наверное более гибко и правильно, но менее удобно. Я плохо знаю vkapi и сурсы этой либы и не могу сказать есть ли проблема, но если проблема разных поведений в одной библиотеке действительно есть, то это надо решать. Полагаю, что можно передать напрямую body запроса и оно преобразуется в JSON с помощью JSON.stringify, который усекает undefined в отличии от URLSearchParams, это путает пользователей. |
@talentumtuum не совсем согласен, могу даже пример из другой весьма крупной либы привести. const hisNotes = await prisma.userNote.findMany({
where: {
userName: "Dmitriy" // вернет записки только дмитрия
}
});
const allNotes = await prisma.userNote.findMany({
where: {
userName: undefined // не вернет записки пользователя "undefined"
}
});
// это равносильно
allNotes = await prisma.userNote.findMany({ }); |
согласен, только вот представь если тебе бот на любую команду будет спамить "undefined". Лучше уж исключение чем silent бессмыслица xd upd: может хотя бы в логах тогда увидят, да пофиксят |
Всё же я думаю ошибка лучше, чем проблемный пост. В таких инструментах как Sentry сложно отследить то что не является ошибкой. Мажор 4 версии был нацелен на улучшенное взамодействие с библиотекой и явный Это так же исправляет неочевидное поведение между |
Привет!
Если коротко, то вызов любого API с параметром, у которого явно указано значение
undefined
приводит к тому, что он передается ВК. Ниже привел пример.What did you do?
ctx
– контекст событияmessage_new
What did you expect to happen?
Параметры со значением
undefined
не должны передаваться, ровно так же, как если бы они были опущены.What was the actual result?
VK-IO переводит
undefined
в строку и отдает это серверу.Versions
vk-io
4.0.1
node
12.17.0
TypeScript
4.0.2
yarn
1.22.4
The text was updated successfully, but these errors were encountered: