negezor / vk-io

Modern VK API SDK for Node.js
https://npm.im/vk-io
MIT License
548 stars 85 forks source link

Cannot read property 'url' of undefined #245

Closed fax1ty closed 4 years ago

fax1ty commented 4 years ago

What did you do?

vk.updates.on('new_wall_post', data => {
eventEmitter.emit('newPost', [data.wall]);
});

What did you expect to happen?

Хотелось бы передавать объект без ошибки

What was the actual result?

Handle polling update error: TypeError: Cannot read property 'url' of undefined
    at PhotoAttachment.get smallPhoto [as smallPhoto] ([REDACTED]\node_modules\vk-io\lib\index.js:1851:21)
    at copyParams ([REDACTED]\node_modules\vk-io\lib\index.js:324:34)
    at PhotoAttachment.[inspectCustomData] ([REDACTED]\node_modules\vk-io\lib\index.js:1898:16)
    at PhotoAttachment.toJSON ([REDACTED]\node_modules\vk-io\lib\index.js:1084:39)
    at PhotoAttachment.[nodejs.util.inspect.custom] ([REDACTED]\node_modules\vk-io\lib\index.js:1100:43)

Additional Info

Почему-то коллстек идёт только из библиотеки, а все мои действия после работы с объектом data прерываются. Поэтому не смог нормально задебагать

Versions

package version
vk-io 4.0.0-rc.30
node 13.8.0
TypeScript 3.8.2
yarn or npm yarn 1.21.1
negezor commented 4 years ago

Какая версия VK API в группе (Bots Long Poll/Callback API)?

fax1ty commented 4 years ago

@negezor, 5.50 / 5.80

negezor commented 4 years ago

А что именно используется для получения событий? Библиотека рассчитана на сейчас на самую последнюю версию 5.103.

fax1ty commented 4 years ago

Использую Long Poll. То есть просто нужно поставить версию повыше? Сейчас проверю

negezor commented 4 years ago

А запускается обновления через startPolling() или start()? Если с первым вариантом, то для получения полных событий в группе должен быть установлен pollingGroupId. Иначе будет запущен по умолчанию User Long Poll. Метод start() автоматический установит эту опцию по необходимости.

fax1ty commented 4 years ago

Через startPolling. В объекте указан pollingGroupId. Он даже возвращает новые посты. Дело именно в url картинки. Я ещё как понял через эвент возвращается не оригинальный объект. Как получить голый объект, который передаёт ВК?

negezor commented 4 years ago

У меня не получается воспроизвести ошибку.

fax1ty commented 4 years ago

@negezor Скорее-всего ошибка была из-за другой версии Long Poll сервера. Но второй вопрос всё ещё остался. Если верить документации ВК, то в wall_post_new они возвращают обычный объект стены image с обычными attachments image в формате

{
type: 'mediaType';
[mediaType: string]: MediaTypeInterface;
}

Но вместо этого библиотека возвращает это image Как можно получить голый ответ?

fax1ty commented 4 years ago

Блин, ответ всё время лежал на поверхности. toJSON(). Это где-то описано?

negezor commented 4 years ago

Этот метод по умолчанию вызывается для JSON.stringify().

fax1ty commented 4 years ago

Не знаю была ли та ошибка багом или просто это случилось из-за старой версии, но спасибо в любом случае

fax1ty commented 4 years ago

А, я понял рановато я закрыл. Он возвращает тоже самое, но с постом. А есть всё-таки какой-то способ получить голый ответ?

negezor commented 4 years ago

Если нужно прямо совсем оригинальный ответ, то можно получить через:

context.payload

Но лучше так не делать.

fax1ty commented 4 years ago

@negezor Оно сработало с кастингом к any. У Вас в типах оно помечено как protected. Поэтому и не отображалась в объекте. А какие могут быть отрицательные последствия? Почему "лучше так не делать"?

negezor commented 4 years ago

В будущем формат может меняться, как было с message_new. А контекст представляет абстракцию.