Мангуста save () зависает в резолвере Apollo - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь сохранить документ в коллекции 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
...