Обновление до v4
VK-IO v4 — это следующее мажорное обновление. Ниже приведён список критических изменений, который поможет вам обновиться.
TL;DR
- Были произведены серьёзные изменения в типизации библиотеки
- Библиотека теперь полностью следует immutable принципу.
- Каждый компонент теперь не зависит от основной инстанции
VK - Убраны лишние компоненты в пользу простых функций (например
resolveResource()илиcreateCollectIterator())
Если ещё короче

Breaking Сhanges
Поддержка Node.js 12 и выше
Библиотека поддерживает теперь только Node.js 12 и выше.
VK
- Удалён геттер/сеттер
vk.token - Удалён метод
vk.setOptions() - Удалён сеттер
vk.captchaHandler, используйте методvk.callbackService.onCaptcha() - Удалён сеттер
vk.twoFactorHandler, используйте методvk.callbackService.onTwoFactor() - Удалён модуль
vk.auth, используйте вместо этого пакет @vk-io/authorization - Удалён модуль
vk.streaming, используйте вместо этого пакет @vk-io/streaming - Удалён экспорт по умолчанию, используйте именованный
diff
- import VK from 'vk-io';
+ import { VK } from 'vk-io';- Удалён
vk.snippets.resolveResource(), вместо модуля добавлена функцияresolveResource()Принимает опции вида:
ts
interface IResolveResourceOptions {
resource: string | number;
api?: API;
}Например
ts
import { resolveResource } from 'vk-io';
const result = await resolveResource({
// Объект API
api,
resource: 'https://vk.ru/durov'
});- Удалён
vk.collect, модуль разбит на мелкие классы и функции - collect.chain() - используйте класс
new Chain()
- collect.chain() - используйте класс
ts
import { Chain } from 'vk-io';
const chain = new Chain({
// Объект API
api
});- collect.executes() - используйте функцию
executes()Принимает опции вида:
- collect.executes() - используйте функцию
ts
interface IExecutesOptions {
api: API;
method: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
queue: Record<string, any>[];
}Например
ts
import { executes } from 'vk-io';
const result = await executes({
// Объект API
api,
method: 'users.get',
queue: [
{ user_id: 1 },
{ user_id: 2 },
{ user_id: 3 },
// ...
]
});- collect..() - используйте функцию
createCollectIterator()Принимает опции вида:
- collect..() - используйте функцию
ts
interface ICollectIteratorOptions {
api: API;
method: string;
params: Record<string, any> & {
count?: number;
offset?: number;
};
maxCount?: number;
countPerRequest: number;
retryLimit?: number;
parallelRequests?: number;
}Например
ts
import { createCollectIterator } from 'vk-io';
const iterator = createCollectIterator({
// Объект API
api,
method: 'messages.getConversations',
params: {
// Будет получать profiles и groups
extended: 1
},
// Максимальный count в методе
countPerRequest: 200,
// Устанавливайте опцию для методов которые не позволяет получить больше N данных, например `users.search`
// maxCount: 1000,
// Количество попыток вызвать снова при ошибке
// retryLimit: 3,
// Количество паралельных вызовов если поддерживается execute
// parallelRequests: 25
});
for await (const chunk of iterator) {
// chunk.received
// chunk.percent
// chunk.total
// chunk.items
// chunk.profiles
// chunk.groups
}API
- Переименование опции apiAttempts в apiRetryLimit
- Удалён геттер
vk.api.API_VERSION - Enum
APIErrorCodeтеперь автоматический генерируется из схемы - Объкты схемы теперь экспортируются в своих namespace
Params,ObjectsиResponses - Удалена автоматическая верификация аккаунта, используйте
@vk-io/authorizationклассAccountVerification - Удалена автоматическая установка
random_idвapi.messages.send(), используйте вместо этого функциюgetRandomId()
ts
import { getRandomId } from 'vk-io';
const result = await api.messages.send({
peer_id: 1234,
random_id: getRandomId(),
text: 'Hello!'
});APIRequest
- Конструктор теперь принимает опции вида:
ts
interface IAPIRequestOptions {
api: API;
method: string;
params: Record<string, any>;
}- Удалён алиас
Request, используйтеAPIRequest
Attachment & ExternalAttachment
- Конструктор теперь принимает опции вида:
ts
interface ISharedAttachmentPayload {
id: number;
owner_id: number;
access_key?: string;
}
interface IAttachmentOptions<P, Type extends string = string> {
api: API;
type: Type;
payload: Partial<ISharedAttachmentPayload> & P;
}DocumentAttachment
- Удалён геттер
document.typeName
Context
- Конструктор теперь принимает опции вида:
ts
interface IContextOptions<
P,
S,
Type extends string = string,
SubType extends string = string
> {
api: API;
upload: Upload;
type: Type;
subTypes: SubType[];
payload: P;
state?: S;
source: UpdateSource;
updateType: string | number;
groupId?: number;
}- Метод
context.is()принимает теперь массив типов
MessageContext
- Метод
context.send()теперь возвращает инстанциюMessageContext - Геттер
context.replyMessageтеперь возвращаетMessageContextвместоMessageReply - Геттер
context.forwardsтеперь возвращает массивMessageContextвместоMessageForward - Изменились входные параметры для методов
context.sendPhotos(),context.sendDocuments(),context.sendAudioMessage()иcontext.sendAudioMessage(). Теперь они принимают объект.
Было:
ts
context.sendPhotos('./cat.png');Стало:
ts
context.sendPhotos({
value: './cat.png',
// filename: 'cat.png',
// contentType: 'image/png',
// contentLength: ...
});
// Или
context.sendPhotos({
values: [{
value: './cat.png'
// filename: 'cat.png',
// contentType: 'image/png'
// contentLength: ...
}],
// timeout: 30_000,
// uploadUrl: '...'
});- Удалён метод
context.getInviteLink() - Удалён метод
context.markAsImportant() - Удалён метод
context.renameChat() - Удалён метод
context.newChatPhoto() - Удалён метод
context.deleteChatPhoto() - Удалён метод
context.inviteUser() - Удалён метод
context.kickUser() - Удалён метод
context.pinMessage() - Удалён метод
context.unpinMessage() - Удалён метод
context.editMessageText() - Удалён метод
context.sendSticker(), используйтеcontext.send({ sticker_id: 123 })
CommentActionContext
- Переименован в
CommentContext
CommentContext
- Удалён геттер
context.userId, используйтеcontext.fromId - Удалён геттер
context.removerUserId, используйтеcontext.deleterUserId
MessageFlagsContext
- Переименован подтип
message_flags_updateвmessage_flags_replace - Переименован подтип
message_flags_setвmessage_flags_add - Переименован геттер
context.isChatвcontext.isFromWebChat - Переименован геттер
context.isFriendsвcontext.isFriendMessage - Переименован геттер
context.isSpamвcontext.isMarkSpam - Переименован геттер
context.isSpamвcontext.isUnmarkSpam - Удалён геттер
context.isFixed - Удалён геттер
context.isMedia
DialogFlagsContext
- Переименован подтип
dialog_flags_updateвdialog_flags_replace - Переименован подтип
dialog_flags_setвdialog_flags_add
RemovedMessagesContext
- Переименован в
DialogMessagesContext
DialogMessagesContext
- Переименован подтип
messages_deleteвdialog_messages_delete - Переименован подтип
messages_restoreвdialog_messages_restore - Переименован геттер
context.idвcontext.localId - Переименован геттер
context.isRemovedвcontext.isDelete - Переименован геттер
context.isRecoveryвcontext.isRestore
UserOnlineContext
- Переименован в
FriendActivityContext
FriendActivityContext
- Переименован подтип
user_onlineвfriend_online - Переименован подтип
user_offlineвfriend_offline - Переименован геттер
context.isUserOnlineвcontext.isOnline - Переименован геттер
context.isUserOfflineвcontext.isOffline - Переименован геттер
context.isSelfExitвcontext.isSelfLeave - Переименован геттер
context.isTimeoutExitвcontext.isTimeoutLeave - Переименован геттер
context.createdAtвcontext.eventAt - Геттер
context.platformтеперь возвращает ID платформы
ReadMessagesContext
- Переименован в
MessagesReadContext
MessagesReadContext
- Переименован подтип
messages_inbox_readвmessages_read_inbox - Переименован подтип
messages_outbox_readвmessages_read_outbox - Переименован геттер
context.idвcontext.localId
MessageAllowContext
- Переименован в
MessageSubscriptionContext
MessageSubscriptionContext
- Тип
message_subscribersпереименован вmessage_subscription
Keyboard
- Удалена константа
Keyboard.DEFAULT_COLOR, используйтеKeyboard.SECONDARY_COLOR
Updates
- Все контексты теперь используют
undefinedвместоnullдля удобной деструктуризации, например:
ts
updates.on('message_new', async (context) => {
const { text = 'default text' } = context;
if (text === 'default text') {
return context.send('Вы ничего не написали');
}
await context.send('Hello!');
});- Удалён метод
updates.hear()иupdates.setHearFallbackHandler(), используйте вместо этого пакет @vk-io/hear - Теперь используются официальные именования событий Например
ts
updates.on('message_new', async (context) => {
await context.send('Hello!');
});- Удален второй аргумент у
updates.startWebhook(), вместо этого передавайте функцию в свойствоnext
ts
updates.startWebhook({
// ...
next(req, res) {
// ...
}
})- Версия polling'а была обновлена до
10 - Переименование опции pollingAttempts в pollingRetryLimit
Upload
- Методы
upload.storiesPhoto()иupload.storiesVideo()теперь возвращаютStoryAttachment - Удалён метод
upload.graffiti(), используйте вместо негоupload.documentGraffiti()илиupload.messageGraffiti() - Изменился формат
source, теперь он принимает только два интерфейса:
ts
upload.messagePhoto({
source: {
value: 'https://picsum.photos/200/300/?image=1',
// filename: 'image.jpeg',
// contentType: 'image/jpeg'
// contentLength?: number;
}
})Или
ts
upload.messagePhoto({
source: {
// uploadUrl?: string;
// timeout?: number;
// Свойство values может быть массивом если загрузка в альбом
values: {
value: 'https://picsum.photos/200/300/?image=1',
// filename: 'image.jpeg',
// contentType: 'image/jpeg
// contentLength?: number;
}
}
})- У элемента в
sourceпоявилось свойствоcontentLength, позволяет указать размер загружаемого файла
Если вы используете поток, который не предоставляет информации о размере в байтах, вам следует указать свойство
contentLength, так как иначе файл не будет загружен. Это особенно актуально для методаupload.video()
Callback Service
- Используйте метод
callbackService.onCaptcha()вместо сеттераcallbackService.captchaHandler - Используйте метод
callbackService.onTwoFactor()вместо сеттераcallbackService.twoFactorHandler
Удалённые экспорты
- Удалён экспорт
attachmentTypes, используйтеAttachmentType - Удалён экспорт
defaultExtensions, используйтеDefaultExtension - Удалён экспорт
defaultContentTypes, используйтеDefaultContentType - Удалён экспорт
captchaTypes, используйтеCaptchaType - Удалён экспорт
messageSources, используйтеMessageSource - Удалён экспорт
resourceTypes, используйтеResourceType - Удалён экспорт
updatesSources, используйтеUpdateSource - Удалён экспорт
apiErrors, используйтеAPIErrorCode - Удалён экспорт
uploadErrors, используйтеUploadErrorCode - Удалён экспорт
updatesErrors, используйтеUpdatesErrorCode - Удалён экспорт
snippetsErrors, используйтеResourceErrorCode - Удалён экспорт
sharedErrors, используйтеSharedErrorCode