Я пытаюсь сохранить документ в коллекции MongoDB с помощью Mongoose внутри распознавателя Apollo (Mutation), но он продолжает зависать, когда пытается по какой-то причине .save()
.
Я знаю, что когдаиспользуя этот метод, он возвращает Promise, если вы не укажете обратный вызов, поэтому я также использую return
с ним, не уверен, что я делаю неправильно.
Я использую площадку GraphQL для выполнениямутация, и она просто ... зависает.
Я использую родной ES6 Promise (взят из установочного файла БД): mongoose.Promise = global.Promise;
Вот некоторый соответствующий код (ES6):
addCard: (parent, { name }) => {
const url = `https://api.scryfall.com/cards/named?exact=${name}`
console.log(`Fetching data from URL: ${url}`);
return axios.get(url)
.then((response) => {
const { set, collector_number } = response.data;
const sourceUrl = response.data.image_uris.border_crop;
const filename = `${set}/${collector_number}.png`;
return axios.get(sourceUrl, { responseType: 'arraybuffer' })
.then((res) => {
console.log(`Resizing Image!`)
return mkdirp(`${__dirname}/../cardimg/${set}`)
.then(() => {
return sharp(res.data)
.resize(226, 321)
.toFile(`${__dirname}/../cardimg/${filename}`)
.then(() => {
const doc = { name, image: filename };
const NewCard = new Card(doc);
return NewCard.save()
.then((doc) => {
return doc;
})
.catch((err) => {
throw new ApolloError(`Unable to save: ${err}`);
})
})
.catch((err) => {
console.log(`Couldn't process: ${err}`);
})
})
})
})
.catch(() => {
throw new ApolloError(`Card not Found!`, `CARD_NOT_FOUND`);
})
}
Кажется, что код работает нормально, пока я не попытаюсь сохранить документ, после чего он зависает на неопределенное время.
Я действительно запутался.Я написал подобный код в прошлом, чтобы делать подобные вещи, и он работал раньше, но он просто не работает.
Я пытался использовать .save()
в качестве Обещания (без обратного вызова), а также пыталсяиспользуя обратный вызов (чтобы вернуть документ клиенту в распознавателе), но безрезультатно.
Нигде не выдается никаких ошибок, я также добавил обработчик mongoose.connection.on('error')
, чтобы увидеть, если что-нибудь там будет выброшенои ничего не происходит.
Единственное, что я могу добавить здесь, это объявление самой модели:
import { model, Schema } from 'mongoose';
import uniqueValidator from 'mongoose-unique-validator';
const cardSchema = new Schema({
name: {
type: String,
required: true,
unique: true
},
image: {
type: String,
required: true,
unique: true
}
});
// Unique field validation (card names)
cardSchema.plugin(uniqueValidator);
// Generate model
const Card = model('Card', cardSchema);
// Export Model
export default Card