На выходных таки запилил обновленную версию @prisma-cms/nextjs с поддержкой баз данных. Так как функционал сильно дополненный по сравнению с прошлой версией, вынес это в отдельный репозиторий @prisma-cms/nextjs-nexus. Новая версия позволяет полноценно работать с базами данных (миграции, запросы и т.п.) и полностью подходит для реализации комплексных проектов с нуля. Напомню, предыдущая версия - это Headless CMS и сама по себе как бы не работала с базой данных. Ей требовалось указывать GraphQL-API сервер, откуда данные получать. А вот новая версия уже сама по себе в том числе и GraphQL-API сервер. Плюс к этому сразу запилил структуру объекта User, мутации регистрации и авторизации, а так же фронтовые формы для этих запросов. Ну а формы тоже довольно интересные, с типизацией.
Скажу так: эта версия вообще классная! И именно она будет использоваться для реализации нескольких проектов, которые я уже давно мыслил. Очень советую к освоению.
А у тебя какая версия VSCode? У меня 1.55.2. Мне кажется, это с обновлением само прилетело. И проверь, в расширениях у тебя имеется такое? Скорее всего оно обеспечивает работу. Это встроенное (buildin). Может ты когда выполнял "Отключить все расширения"?
Кстати, на всякий случай замечу, что эти скрипты не обязательно именно через эту панель запускать. Это просто для удобства. А так все эти скрипты прописаны в package.json и можно запускать просто в терминале, как тот же yarn dev
Поймал багу. Сейчас этого в призме нельзя. Еще не тестировал @prisma/client-3, может там пофиксили. Сам же я не натыкался на такое, потому что в енамы как правило загоняют какие-то константы, а на фронте выводится значение по справочнику или еще как. Ведь если ты захочешь склонение поменять или мультиязычность ввести, что ты будешь делать? Значение енамов никогда по идее не должно меняться (добавляться - да, а удаляться/меняться - это экстренный случай). Для примера как выводится текст на этом же проекте:
import{ UserTechnologyHiringStatus }from'src/modules/gql/generated'/**
* Возвращает перевод статуса заинтересованности в трудоустройстве
*/exportconst getUserTechnologyHiringStatusText =(status: UserTechnologyHiringStatus
):string=>{switch(status){case UserTechnologyHiringStatus.ACTIVE:return'Очень заинтересован'case UserTechnologyHiringStatus.NEGATIVE:return'Не заинтересован'case UserTechnologyHiringStatus.NEUTRAL:return'Не против'default:return''}}
Дима, пересматривай начиная с 25 минуты минут 10-15, там все это подробно объясняется (слишком подробно и растянуто, но все же).
Уточняю в чем твоя ошибка:
>> - Добавил модель Post в schema.prisma
- выполнил prisma:db:push - получил новую таблицу в БД
Это фаза 1 (работа с базой данных).
>> - выполнил generate:types
А вот это уже фаза 3, то есть подтягивание GraphQL-API на сторону фронта и формирование методов и типов.
Ты пропустил фазу 2 - не поправил GraphQL-API. За это отвечает Nexus. То есть пока ты не обновишь схему для фронтового АПИ, ничего у тебя на фронте нового не появится. Призма - отдельно, GraphQL-API - отдельно.
И еще: не забудь по завершении всего выполнить еще yarn prisma:migrate:create, чтобы сформировать новую миграцию. То, что ты обновляешь призма-схему и пушишь руками в БД - это еще не формирует скриптов миграции, которые срабатывают на yarn prisma:deploy. Этот момент тоже есть в видео.
Только тут важный момент: при создании миграции у тебя будет очищена база данных. Почему так происходит? Потому что ты уже выполнил prisma:db:push и в базе данных уже есть изменения структуры. Нельзя поверх выполнить еще такие же структурные запросы. Поэтому призма удаляет все таблицы, выполняет имеющиеся миграции и создает новую миграцию, накатывает ее и сохранят файл миграции в prisma/migrations/.
По этой причине, чтобы не потерять данные, надо делать так:
1. Прежде чем внести какие-либо структурные изменения в БД, снимаешь полный дамп базы.
2. Вносишь изменения.
3. Создаешь миграцию (данные все при этом будут потеряны).
4. Удаляешь все таблицы в базе данных.
5. Выполняешь импорт своего дампа.
6. Выполняешь yarn prisma:deploy чтобы накатить новую миграцию. При этом данные не будут потеряны, если все ОК. Если не ОК, то миграция просто не будет выполнена.
То есть в режиме разработки не редко теряется база данных при внесении изменений таким образом, но на боевую yarn prisma:deploy обычно проходит без проблем.
Судя по всему, ты думаешь, что сначала должно что-то появиться в /src/gql и только потом уже можно добавлять что-то в типы /server/nexus/types. Это не так. Если разбирать наименование папки /server/nexus/types, то здесь types - это не тайпскриптовые типы, а графкюэльные. То есть здесь надо более хорошо прокачаться в GraphQL и понимать, что там все есть типы (даже скалярные). При этом есть типы на чтение (все типы, что мы перечисляем в теле запроса для получения данных), а есть входящие типы (input-types), это все то, что мы передаем в параметрах. Nexus - это библиотека, которая позволяет генерировать GraphQL-схему (включая типы) на основе нашего кода. Для примера
Таким образом мы описываем структуру GraphQL-типа User. Этот тип генерируется и попадает в server/nexus/generated/schema.graphql
Это именно та схема, которую использует GraphQL-сервер. Посмотри внимательно эту схему у себя в проекте. Если ты там не видишь того, что ожидаешь получить на фронте, то ты этого не получишь. К примеру, у меня сейчас так (помимо прочего):
"""
Пользователь
"""typeUser{"""
Когда создан
"""createdAt:DateTime!email:Stringfullname:Stringid:String!"""
Avatar
"""image:Stringsudo:Booleanusername:String}
То есть то, что я прописал в нексусе, попало сюда. И вот теперь этот тип я вижу и в плейграунде
Вот пока ты в GraphQL-Playground не увидишь то, что ожидаешь, на фронте ты не сможешь это получить. И лишь только тогда, когда ты там увидишь желаемое, только тогда ты можешь добавлять фронтовые файлы .graphql и выполнять yarn generate:types, а иначе ты просто будешь получать ошибку.
Правильней указать строковое имя, то есть { type: "Mashrooms" }
Вторая подсказка: категорически избегай названий типов с окончанием на s (то есть множественность). В каком-то месте тебе надо будет массив таких типов и как ты будешь писать? Mashroomss? Особенно не советую наименование типов (именно тех, которые идут потом в названия таблиц, а не колонки) на s заканчивать в самой призма-схеме. Призма втупляет с формированием имен множественных переменных и получается все очень плохо.
Подсказка 3: имена типов в графе уникальные. Если ты назвал енам Mashroom, то имей ввиду, что потом если захочешь создать тип Mashroom (чтобы у него была своя таблица), не получится. Нельзя и тип и енам иметь с одним названием. Обычно енамы для каких-то совсем не больших списков используют (к примеру, статусов). Но сущность типа Гриб лучше было бы сразу загнать в таблицу.
Нет. Это этап уже прописывания граф-запросов на стороне фронта, то есть уже в этот момент граф-схема в АПИ должна содержать все, что ты запрашиваешь. И прописывается это все на уровне редактирования нексус-файлов.
Да как обычно: забыл расписать что хотел получить, что делал и что на выходе получил. Опять из меня телепата делаешь. Можешь написать что именно искал и где что не нашел?
Ты сказал, что сделал, но так и не сказал чего именно не смог найти. API у тебя наверняка работает. Очевидно, что ты не видишь какие-то определенные граф-типы. Так вот будь конкретней в том, что именно не так, что именно не видишь. Можешь назвать хоть один тип, который ты прописал в нексусе, но не видишь в АПИ?
Просто иначе при установке в браузер гугл съест и ее и будет чуть-чуть ругаться и места много лишнего будет скушано.
5. В хроме открываешь управление расширениями, включаешь Developer mode (в правом верхнем углу) и жмешь Load unpacked (в левом правом углу), выбираешь папку проекта и жмешь Select (то есть выбираешь не какой-то файл, а именно указываешь путь в папку).
Если все ОК, появится установленное расширение.
Иконку запуска ищи там же, где и все остальные иконки расширений. Чтобы работало, конечно же надо, чтобы АПИ работало (то есть http://localhost:3000/api/ ).
Да, в целом ОК. Только переименуй PostQuery в PostExtendQuery и MashroomQuery в MashroomExtendQuery.
Ну и самое веселое: вынеси Mashroom в отдельный файл. Сейчас у тебя это в одном файле с постами. Знаю, ты так сделал, потому что не знаешь как это сделать , и решил просто не спрашивать про возникающую ошибку :) Но это можно сделать. Поломай немного голову (попробуй найти решение в схеме freecode.academy)
описываю типы Post и Mashroom в одном файле и все работает.
При попытке вывести Mashroom в отдельный файл выдаёт ошибки.
Логика подсказала, что если ошибка после разделения с Post, то как минимум можно сделать импорт Post - частично решило.
Ошибка, которую не пойму как решить:
---
Argument of type '{ description: string; filtering: true; ordering: true; }' is not assignable to parameter of type '{ type: "ERROR: No subset types are available. Please make sure that one of your GraphQL type is a subset of your t.model('<ModelName>')"; } & { alias?: undefined; resolve?: CustomFieldResolver<...> | undefined; computedInputs?: LocalComputedInputs<...> | undefined; } & NexusGenPluginFieldConfig<...> & CommonFieldCo...'.
Property 'type' is missing in type '{ description: string; filtering: true; ordering: true; }' but required in type '{ type: "ERROR: No subset types are available. Please make sure that one of your GraphQL type is a subset of your t.model('<ModelName>')"; }'.ts(2345)
static.d.ts(60, 5): 'type' is declared here.(property) CommonFieldConfig.description?: string | undefined
The description to annotate the GraphQL SDL
---
Если я правильно понимаю, тип Mashroom должен быть прописан в t.model('<ModelName>'), но вот что это значит - не понимаю.
Судя по всему ты просто опять забыл запустить yarn dev (о чем я уже не раз напоминал). То есть в целом у тебя там было ОК, просто надо было, чтобы нексус перегенерировал методы и типы (он это делает автоматически при изменении файлов, но надо, чтобы был запущен проект). Ну и конечно надо было удалить грибы из файла постов, чтобы у тебя дублей классов не было. Отправил ПР: https://github.com/linklib/gribok-prisma/pull/1
Ну и еще момент, который, как я и предполагал, ты не победишь, хотя следовало бы. Вот ты в грибах импортируешь класс поста. Обрати внимание, что у меня такого нигде нет. В том же типе User из текущего проекта много связей на другие типы, но там нет импортов этих типов. А все почему? Потому что в "type": у меня прописываются не константы-объекты, а строчные имена этих типов. Пересмотри еще раз видео, там тоже это все показывается/рассказывается. Обращай внмиание на типы переменных (видь разницу между объектами и простыми строками).
IDE подсвечивает ошибку на ...like... (Property 'like' does not exist on type 'PrismaClient<PrismaClientOptions, never, RejectOnNotFound | RejectPerOperation | undefined>'.ts(2339) )
ни yarn types, ни yarn types:server ничего не находят.
Я закинул коммит --no-verify на всякий случай) Не посмотришь, что это за ошибка может быть?
Дима, у тебя там все ОК. А ошибки в IDE в таких случаях - это не редкость. Дело в том, что когда ты внес изменения в призма-схему и перегенерил все, изменилось много файлов и типов. Тайпскрипт не держит все в голове и в такой момент вполне возникают ситуации, когда в кеше тайпскрипта не актуальные типы (или он еще не увидел новые типы). В таких случаях помогает рестарт тайпскрипт-сервера. В главном меню vscode выбери View -> Command Palette, а там найди TypeScript: Restart TS Server. Кликай его.
И немного жди. Занимает некоторое время. Внизу левее будет виден статус, что идет Initializing JS/TS. Как исчезнет, так ОК.
Еще важный момент: vscode бывает не ту версию тайпскрипта загружает. Из-за этого разное поведение при проверке типов (бывает в IDE совсем не то, что в консоли выполняется). Что надо сделать?
1. Проверить какая версия TS установлена в зависимостях.
yarn why typescript
Как видим, сейчас стоит 4.4.3
Смотрим в трее справа используемую текущую версию (Важно: должен быть открыт JS или TS файл для редактирования, чтобы IDE понимала, что сейчас нужен TS, иначе этой информации в трее просто не будет). Видим, что в IDE сейчас тоже используется 4.4.3. ОК, кликаем в 4.4.3 и выбираем в выпавшем меню Select typescript version.
И вот здесь как раз и кроется Дьявол: видно, что сейчас используется версия тайпскрипта, установленная в саму IDE. У меня все свежее установлено, поэтому версии и совпадают. Но часто бывает, что есть разница в версиях и бывает очень серьезная такая разница. В результате консольные команды дают одно, а в IDE мы видим другое. Надежней выбирать именно Use Workspace Version, то есть будет браться из node_modules текущего проекта.