Совершенно не факт. Нужно тестирование проводить. Хотя вряд ли разница будет ощутимая. Но есть разница в восприятии и объеме кодовой базы.
Если правильно понимаю - и по времени быстрее должно работать?
Очень интересный урок, который хотелось бы обсудить... К своему удивлению, я не нашел здесь во всех уроках по Javascript уроков, касающихся методов типа Array.find(), Array.filter(), Array.findIndex() и т.п. При этом это очень полезные методы, используемые чуть ли не каждый день. И на мой взгляд они, во-первых, более короткие, чем конструкции типа for(...), а во-вторых, более логичны в плане восприятия.
Сразу отмечу, что я не хочу сказать, что другие решают не правильно. Я просто хочу показать другие варианты.
Сравним код большинства ответов в этой задаче:
и одно из моих решений:
Какое решение вам кажется более наглядным?
Как мне кажется, вариант с перечислением for (let i = 0; i < contacts.length; i++) более громоздкий и в нем больше отвлекающих переменных. То есть мы создаем переменную-счетчик i, сравниваем ее со значением длины массива, каждую итерацию увеличиваем ее значение, используем для получения элемента массива и т.п., и все это вместо того, чтобы работать просто с массивом и его элементами.
В моем варианте используется метод массива find(condition). Уточню, что прототипом всех массивов является Array. Соответственно, все методы его наследуются и конечным массивам. Метод find(condition) принимает в качестве параметра функцию, используемую для поиска элемента в текущем массиве (первого, удовлетворяющего условию). То есть массив перечисляет все свои элементы до тех пор, пока применяемая к ним функция не вернет истину (или то, что может быть преобразовано в логическое true). В моем случае это n => n.firstName === name.
Для кого-то данная конструкция может быть не понятна, уточню: это стрелочная функция. Если переводить на более понятный синтаксис, то это так:
Итак, применив метод Array.find() вместо перечисления for(...) я попытался найти нужный мне элемент.
const item = contacts.find(n => n.firstName === name);
В данном случае (если понять синтаксис) все сильно понятней и логичней: я выполнил метод поиска у самого массива и получил найденный элемент из него и присвоил в переменную item (или присвоил undefined, если элемент не был найден).
Далее я уже работаю с проверками на самом элементе
То есть вроде тоже все понятно: если элемент item есть, то в нем проверяю значение, если нет, то возвращаю сообщение об ошибке. И никаких лишних i и т.п.
В погоне за сокращением можно и вовсе вот так написать:
То есть я сразу проверил есть ли объект и если нет, возвращяю 'No such contact', иначе возвращаю свойство объекта (если оно есть) или сообщение 'No such property'
Да, такой стиль может показаться более сложным и запутанным, но сейчас чаще именно так и пишут, потому что меньше кода - меньше над чем думать приходится.
Понял, спасибо! Ковыряю дальше)
Дима, в целом правильно, но очередность чуть другая. Надо так:
3. Сюда https://github.com/prisma-cms/nextjs-nexus/tree/master/server/nexus/types надо добавить описание таблицы для nexus, который проверяет соответствие типов полей в gql
4. Сюда https://github.com/prisma-cms/nextjs-nexus/tree/master/src/gql добавляем .graphql для новой таблицы
Судя по всему, ты думаешь, что сначала должно что-то появиться в /src/gql и только потом уже можно добавлять что-то в типы /server/nexus/types. Это не так. Если разбирать наименование папки /server/nexus/types, то здесь types - это не тайпскриптовые типы, а графкюэльные. То есть здесь надо более хорошо прокачаться в GraphQL и понимать, что там все есть типы (даже скалярные). При этом есть типы на чтение (все типы, что мы перечисляем в теле запроса для получения данных), а есть входящие типы (input-types), это все то, что мы передаем в параметрах. Nexus - это библиотека, которая позволяет генерировать GraphQL-схему (включая типы) на основе нашего кода. Для примера
Таким образом мы описываем структуру GraphQL-типа User. Этот тип генерируется и попадает в server/nexus/generated/schema.graphql
Это именно та схема, которую использует GraphQL-сервер. Посмотри внимательно эту схему у себя в проекте. Если ты там не видишь того, что ожидаешь получить на фронте, то ты этого не получишь. К примеру, у меня сейчас так (помимо прочего):
То есть то, что я прописал в нексусе, попало сюда. И вот теперь этот тип я вижу и в плейграунде
Вот пока ты в GraphQL-Playground не увидишь то, что ожидаешь, на фронте ты не сможешь это получить. И лишь только тогда, когда ты там увидишь желаемое, только тогда ты можешь добавлять фронтовые файлы .graphql и выполнять yarn generate:types, а иначе ты просто будешь получать ошибку.
Николай, посмотри, пожалуйста, последовательность действий: все ли верно понял.
Для того, чтобы добавить новую таблицу:
1. Добавляем описание таблицы в prisma
2. prisma:db:push - в БД появляется новая таблица
3. Сюда https://github.com/prisma-cms/nextjs-nexus/tree/master/src/gql добавляем .graphql для новой таблицы
4. Сюда https://github.com/prisma-cms/nextjs-nexus/tree/master/server/nexus/types надо добавить описание таблицы для nexus, который проверяет соответствие типов полей в gql
5. generate:types - генерация кода
Правильно понял или что-то забыл?
-----------------------
6. Действия предыдущего поста
И еще: не забудь по завершении всего выполнить еще yarn prisma:migrate:create, чтобы сформировать новую миграцию. То, что ты обновляешь призма-схему и пушишь руками в БД - это еще не формирует скриптов миграции, которые срабатывают на yarn prisma:deploy. Этот момент тоже есть в видео.
Только тут важный момент: при создании миграции у тебя будет очищена база данных. Почему так происходит? Потому что ты уже выполнил prisma:db:push и в базе данных уже есть изменения структуры. Нельзя поверх выполнить еще такие же структурные запросы. Поэтому призма удаляет все таблицы, выполняет имеющиеся миграции и создает новую миграцию, накатывает ее и сохранят файл миграции в prisma/migrations/.
По этой причине, чтобы не потерять данные, надо делать так:
1. Прежде чем внести какие-либо структурные изменения в БД, снимаешь полный дамп базы.
2. Вносишь изменения.
3. Создаешь миграцию (данные все при этом будут потеряны).
4. Удаляешь все таблицы в базе данных.
5. Выполняешь импорт своего дампа.
6. Выполняешь yarn prisma:deploy чтобы накатить новую миграцию. При этом данные не будут потеряны, если все ОК. Если не ОК, то миграция просто не будет выполнена.
То есть в режиме разработки не редко теряется база данных при внесении изменений таким образом, но на боевую yarn prisma:deploy обычно проходит без проблем.
Спасибо, изучаю заново)
Дима, пересматривай начиная с 25 минуты минут 10-15, там все это подробно объясняется (слишком подробно и растянуто, но все же).
Уточняю в чем твоя ошибка:
>> - Добавил модель Post в schema.prisma
- выполнил prisma:db:push - получил новую таблицу в БД
Это фаза 1 (работа с базой данных).
>> - выполнил generate:types
А вот это уже фаза 3, то есть подтягивание GraphQL-API на сторону фронта и формирование методов и типов.
Ты пропустил фазу 2 - не поправил GraphQL-API. За это отвечает Nexus. То есть пока ты не обновишь схему для фронтового АПИ, ничего у тебя на фронте нового не появится. Призма - отдельно, GraphQL-API - отдельно.
Николай, всё-таки нужно подтолкнуть в верном направлении)
- Добавил модель Post в schema.prisma
- выполнил prisma:db:push - получил новую таблицу в БД
- выполнил generate:types - ошибок нет, но в папках gql в src никаких изменений нет, в api, соответственно, тоже.
Что забыл добавить ,чтобы изменения подхватились и добавились?