Эпизод 7: Создание преобразователя пользователя (клон Evernote)
В предыдущем эпизоде мы создали наши преобразователи заметок и многое другое… посмотрите последний эпизод, если вы его пропустили → Часть 6
В этом эпизоде мы создадим преобразователь пользователей и установим связь между нашими заметками и пользователями.
Повестка дня:
- Создать преобразователь пользователя
- Поле UserCreator в заметках и созданных заметках
- Вспомогательные функции для получения созданного массива заметок
Создать преобразователь пользователя
ШАГ 1. Убедитесь, что ваш сервер запущен и работает
ШАГ 2. Зайдите в папку resolvers
, затем перейдите к файлу user.js
. Здесь вы напишете свой код преобразователя пользователя.
ШАГ 3: Давайте продолжим и создадим преобразователь пользователя. Ваш файл user.js
должен выглядеть так →
// user.js const User = require('../models/users') module.exports = { createUser: async({userInput}) { const user = new User({ username: userInput.username, email: userInput.email, password: userInput.password }) try{ const result = await user.save() return { ...result._doc } } catch(err){ throw err } } }
Объяснение:
- Мы назвали наш преобразователь «createUser».
- Мы создали пользователя, используя нашу модель пользователя, а затем сохранили его в
const user
. - В нашем
try block
мы сохранили этот пользовательский документ вconst result
и вернули этот пользовательский документ{ ...result._doc }
- В нашем
catch block
мы передаем err, а затем бросаем err.
мы все настроены на создание пользователей…
Поле UserCreator в заметках и созданных заметках
Теперь нам нужно снова вернуться к распознавателю заметок, давайте сосредоточимся на распознавателе заметок прямо сейчас. В notes
resolver мы в настоящее время находим все заметки в нашей БД и возвращаем их, нам нужно что-то добавить к нашему возврату
ШАГ 1: В нашем распознавателе заметок добавьте userCreator
. Как мы обсуждали в предыдущих эпизодах, userCreator
указывает, какой пользователь создал эту заметку. Теперь это должно выглядеть так →
notes: async () =>{ try { const Notes = await Note.find({}) return Notes.map(note =>{ return {...note._doc, userCreator: '5d28e81606fb7981dcfd0ee8')} }) }catch(err){ throw err } },
В целях тестирования мы добавили идентификатор пользователя из нашей БД. Таким образом, для каждой заметки, которую мы возвращаем, мы теперь также можем запрашивать userCreator
этой заметки. Который является «билли» в моей БД.
Однако, несмотря на то, что у нас есть идентификатор этого пользователя, мы пока не получим эти пользовательские данные.
ШАГ 2: В нашем преобразователе createNotes
нам также нужно добавить поле userCreator
. Это будет тот же идентификатор, который мы использовали раньше, теперь он должен выглядеть так →
createNote: async ({noteInput}) =>{ const note = new Note({ title: noteInput.title, content: noteInput.content, image: noteInput.image, userCreator: '5d28e81606fb7981dcfd0ee8' --> user that created note }) let notes; try { const result = await note.save() notes = { ...result._doc } return notes }catch (err){ throw err } }
ШАГ 3: Теперь, когда у нас есть пользователь, нам нужно поместить созданные нами заметки в массив пользователя createdNotes
. Этот код сделает это →
createNote: async ({noteInput}) =>{ const note = new Note({ title: noteInput.title, content: noteInput.content, image: noteInput.image, userCreator: '5d28e81606fb7981dcfd0ee8' }) let notes; try { const result = await note.save() notes = { ...result._doc } const findUser = await User.findById(5d28e81606fb7981dcfd0ee8) if(!findUser) return new Error('User not found') findUser.createdNotes.push(note) await findUser.save() return notes }catch (err){ throw err } }
Объяснение:
- Мы находим пользователя по ID и сохраняем этот документ в
const findUser
- Если этот пользователь не существует, мы выдаем ошибку.
if(!findUser) return new Error(‘User not found’)
- Если они существуют, у вас есть доступ к их данным (данным пользователя) вместе с полем
createdNotes
. Теперь вы можете отправлять заметки в их массивcreatedNotes
.findUser.createdNotes.push(note)
- После этого сохраните пользователя
await findUser.save()
Обзор. К созданной нами заметке будет привязан пользователь по умолчанию «билли» по его идентификатору. Чтобы поместить заметку в массив createdNotes
, нам нужно сначала найти этого пользователя.
Вспомогательные функции для получения пользовательских и созданных заметок
ШАГ 1: Все еще внутри файла распознавателя заметок над module.exports
создайте метод (функцию) с именем getUser
и поместите следующий код.
const getUser = async(userid) => { try { const userID = await User.findById(userid) if(userID) return {...userID._doc} }catch(err){ throw err } } // module.exports {...}
Объяснение:
- Этот метод принимает
userid
в качестве параметра - Мы ищем в БД этого пользователя по
userid
, который мы передаем, затем сохраняем этот документ вconst userID
- Если мы найдем пользователя, вернуть его данные (имя пользователя, адрес электронной почты, пароль, созданные заметки)
{...userID._doc}
ШАГ 2: Давайте создадим этот метод getNotes
→
const getNotes = async(noteid) =>{ try{ const notesID = await Note.find({_id: {$in: noteid}}) return notesID.map(note =>{ return {...note._doc} }) }catch(err){ throw err } } // const getUser = () => {...} // module.exports = {...}
Объяснение:
- Этот метод принимает
noteid
в качестве параметра - В
try block
мы находим примечание, где_id
в массивеcreatedNotes
соответствуетnoteid
, которое мы передаем.const notesID = await Note.find({_id: {$in: noteid}})
- Затем мы перебираем этот массив документов и возвращаем единственный документ заметки. →
return {…note._doc}
- Наконец, в
catch block
мы обрабатываем ошибку, бросая ее
ШАГ 3: Теперь нам нужно использовать эти вспомогательные методы там, где они нам нужны. В наш преобразователь notes
добавьте этот код.
notes: async () =>{ try { const Notes = await Note.find({}) return Notes.map(note =>{ return {...note._doc, userCreator: getUser(note._doc.userCreator)} }) }catch(err){ throw err } }
Объяснение:
- Вместо того, чтобы возвращать только идентификатор пользователя в
userCreator
, мы вызовем методgetUser
, который принимает идентификатор (тот же идентификатор, который является пользователем «билли») в качестве параметра и фактически возвращает данные пользователя. - Этот метод вызывается ТОЛЬКО, если мы запрашиваем
userCreator
заметки. Catch block
обработает ошибку (выбросит ошибку)
ШАГ 4: Давайте сделаем то же самое в методе getUser
.
const getUser = async(userid) =>{ try { const userID = await User.findById(userid) if(userID) return {...userID._doc, createdNotes: getNotes(userID._doc.createdNotes)} }catch(err){ throw err } }
Объяснение:
- Поскольку мы хотим запросить созданные заметки, связанные с этим пользователем, мы должны получить эти заметки с помощью нашего метода
getNotes
. - мы передаем массив userID createdNotes, чтобы наш
getNotes
мог найти_id
, соответствующий идентификатору в переданном вами массиве.
Обязательно протестируйте эти запросы, чтобы убедиться, что они работают.
Пример: когда вы запрашиваете заметки, посмотрите, можете ли вы также запросить userCreator
, теперь вы сможете получить данные пользователя, и вы можете запросить их createdNotes
, если хотите.
{ notes{ _id, title, userCreator{ username, email } } }
Если что-то пойдет не так, попробуйте начать с нуля и очистить свои коллекции (заметки и пользователи), создать нового пользователя и заменить следующие поля идентификатором пользователя. Затем создайте заметку с этим пользователем и повторите запрос.
createNote: async ({noteInput}) =>{ const note = new Note({ title: noteInput.title, content: noteInput.content, image: noteInput.image, userCreator: 'userID you just created' }) let notes; try { const result = await note.save() notes = { ...result._doc } const findUser = await User.findById('userID you just created') if(!findUser) return new Error('User not found') findUser.createdNotes.push(note) await findUser.save() return notes }catch (err){ throw err } }
Это все, что касается этого эпизода, если у вас, ребята, есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать меня :) Надеюсь, вам понравится… больше будет
Если вы хотите посмотреть видео, вы можете посмотреть его здесь → Создать преобразователь пользователя и другое