Эпизод 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
}
}

Это все, что касается этого эпизода, если у вас, ребята, есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать меня :) Надеюсь, вам понравится… больше будет

Если вы хотите посмотреть видео, вы можете посмотреть его здесь → Создать преобразователь пользователя и другое