Метод mongoose findOne возвращает значение null

Я слежу за учебником это. Несмотря на то, что код - это именно то, что упоминается в руководстве, каждый раз, когда я запускаю запрос на мутацию graphql для обновления определенного твита, он возвращает null и записывает null в cmd.

Я подтвердил, что версия мангуста такая же (4.11.3). Я считаю, что что-то не так с методом findOne, так как даже в преобразователе deleteTweet findOne возвращает null. Это потому, что findOne нужен обратный вызов? но в учебнике обратный вызов не передается. Я также заметил, что findOneAndUpdate работает нормально, но создает новую запись, а не обновляет существующий твит.

  updateTweet: async (_, { id, ...rest}, { user }) => {
    try {
      await requireAuth(user)
      const tweet = await Tweet.findOne({ id, user: user.id });
      console.info(tweet);

      if (!tweet) {
        throw new Error('Not Found!');
      }

      return tweet.save();

    } catch (e) {
      throw e;
    }
  },


  deleteTweet: async (_, { id }, { user }) => {
    try {
      await requireAuth(user);
      const tweet = await Tweet.findOne({ id, user: user.id });

      if (!tweet) {
        throw new Error('Not Found !')
      }

      await tweet.remove();
      return {
        message: "Deleted Tweet Successfully"
      }
    }catch(error) {
      throw error;
    }
  }
}

TweetSchema

import mongoose, { Schema } from 'mongoose';

const TweetSchema = new Schema({
  text: {
   type: String,
   minlength: [5, 'Text need to be longer'],
   maxlength: [144, 'Text is too long'],
 },
  user: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  favoriteCount: {
    type: Number,
    default: 0
  }
}, { timestamps: true})

export default mongoose.model('Tweet', TweetSchema);

Что такое id? В чем его ценность?

Akrion 21.10.2018 03:13

Идентификатор создается с помощью graphql и сохраняется в коллекции твитов на mongodb. Это то, что он регистрирует после выполнения запроса на обновление на graphiql tweets.findOne ({user: ObjectId ("5bcbcac57870760db4ff34ab"), id: '5bcbcac57870760db4ff34ab'}, {{'} })нулевой

Ash 21.10.2018 04:05

так что ваш идентификатор должен быть ObjectId(id)

Akrion 21.10.2018 04:07
Tweet.findOne({ id: mongo.ObjectID(id), user: user.id })
Akrion 21.10.2018 04:07

Но в TweetSchema он уже есть, не могли бы вы проверить правку.

Ash 21.10.2018 04:20

TweetSchema имеет только user, но не id.

ZeroCho 21.10.2018 10:37

@Akrion Я установил модуль mongodb и импортировал его, но он все еще не работает.

Ash 21.10.2018 22:43

@ZeroCho Не могли бы вы посоветовать, что мне нужно сделать, чтобы все заработало?

Ash 21.10.2018 22:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
8
979
1

Ответы 1

У вас опечатка. В MongoDB ключевым полем является _я бы NOT id. Это добавляется MongoDB автоматически, если не указано иное, поэтому вам нужно изменить свой код, чтобы вместо этого использовать _id.

Нет, я уверен, что проблема не в id, поскольку у меня есть преобразователь getTweet, подобный этому getTweet: async (, {id}, {user}) => {try {await requireAuth (user); вернуть Tweet.findById (id); } поймать (е) {бросить е; }}, и это дает хороший результат, и я уже пробовал _id, но это не сработало.

Ash 21.10.2018 22:53

findById не принимает объект, он принимает фактическое значение. Поэтому, когда вы делаете findById (id), он отличается от findOne ({id}), поскольку последний будет неправильно использовать идентификатор имени ключа

sofcal 21.10.2018 22:57

Если вы измените код в updateTweet на: const tweet = await Tweet.findOne ({_id: id, user: user.id}); // также может потребоваться user._id, если это объект db. Это работает?

sofcal 21.10.2018 22:58

Спасибо за информацию ! Я знаю, что это ключевое поле _id, но когда я изначально настраивал _id, это давало мне некоторую ошибку "" ID не может представлять значение: {_bsontype: \ "ObjectID \" ", поэтому я везде изменил _id на id, так иметь значение?

Ash 21.10.2018 23:09

Только что я изменил весь идентификатор на _id, чтобы попробовать, и он все еще дает мне ту же ошибку при выполнении любого запроса.

Ash 21.10.2018 23:10

Да, это имеет значение. MongoDB по умолчанию использует _id, поэтому он автоматически добавляет его во все документы, если не указан; поэтому вам нужно использовать это в запросах, если вы хотите что-то найти. Вы можете добавить поле с именем id, если хотите, но у вас его нет в вашей схеме, поэтому я предполагаю, что вы ищете _id. Мне нужно было бы увидеть код, вызывающий ошибку bsonType, но я подозревал, что вы пытались что-то с ним сделать, не вызывая toString ()

sofcal 21.10.2018 23:16

Можете ли вы загрузить образец кода на github? и я посмотрю

sofcal 21.10.2018 23:17

Другие вопросы по теме