Я слежу за учебником это. Несмотря на то, что код - это именно то, что упоминается в руководстве, каждый раз, когда я запускаю запрос на мутацию 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);
Идентификатор создается с помощью graphql и сохраняется в коллекции твитов на mongodb. Это то, что он регистрирует после выполнения запроса на обновление на graphiql tweets.findOne ({user: ObjectId ("5bcbcac57870760db4ff34ab"), id: '5bcbcac57870760db4ff34ab'}, {{'} })нулевой
так что ваш идентификатор должен быть ObjectId(id)
Tweet.findOne({ id: mongo.ObjectID(id), user: user.id })Но в TweetSchema он уже есть, не могли бы вы проверить правку.
TweetSchema имеет только user, но не id.
@Akrion Я установил модуль mongodb и импортировал его, но он все еще не работает.
@ZeroCho Не могли бы вы посоветовать, что мне нужно сделать, чтобы все заработало?





У вас опечатка. В MongoDB ключевым полем является _я бы NOT id. Это добавляется MongoDB автоматически, если не указано иное, поэтому вам нужно изменить свой код, чтобы вместо этого использовать _id.
Нет, я уверен, что проблема не в id, поскольку у меня есть преобразователь getTweet, подобный этому getTweet: async (, {id}, {user}) => {try {await requireAuth (user); вернуть Tweet.findById (id); } поймать (е) {бросить е; }}, и это дает хороший результат, и я уже пробовал _id, но это не сработало.
findById не принимает объект, он принимает фактическое значение. Поэтому, когда вы делаете findById (id), он отличается от findOne ({id}), поскольку последний будет неправильно использовать идентификатор имени ключа
Если вы измените код в updateTweet на: const tweet = await Tweet.findOne ({_id: id, user: user.id}); // также может потребоваться user._id, если это объект db. Это работает?
Спасибо за информацию ! Я знаю, что это ключевое поле _id, но когда я изначально настраивал _id, это давало мне некоторую ошибку "" ID не может представлять значение: {_bsontype: \ "ObjectID \" ", поэтому я везде изменил _id на id, так иметь значение?
Только что я изменил весь идентификатор на _id, чтобы попробовать, и он все еще дает мне ту же ошибку при выполнении любого запроса.
Да, это имеет значение. MongoDB по умолчанию использует _id, поэтому он автоматически добавляет его во все документы, если не указан; поэтому вам нужно использовать это в запросах, если вы хотите что-то найти. Вы можете добавить поле с именем id, если хотите, но у вас его нет в вашей схеме, поэтому я предполагаю, что вы ищете _id. Мне нужно было бы увидеть код, вызывающий ошибку bsonType, но я подозревал, что вы пытались что-то с ним сделать, не вызывая toString ()
Можете ли вы загрузить образец кода на github? и я посмотрю
Что такое
id? В чем его ценность?