Запрос GraphQL возвращает пустой массив, но запрос MongoDB работает - PullRequest
0 голосов
/ 24 сентября 2019

Редактировать: я обнаружил, что решением проблемы была установка параметра коллекции.В mongoDB crypto_debug не фигурирует во множественном числе.Очень большая головная боль.

Существует разница в автоматическом именовании коллекций между PyMongo и Mongoose:

ex:

inserting to db using mongoose:
bandcampDebugModel = db2.model('bandcamp_debug', bandcampDebugSchema);

becomes 'bandcamp_debugs'

inserting to db using PyMongo:
db2 = client['cryptoDebug']
debug = db2.crypto_debug

remains 'crypto_debug'

The solution was to add the explicit collection name:

const cryptoDebugModel = crypto_debug.model("crypto_debug",
    {
        name : String,
        dateOfIssue: String,
        error: String
    }, "crypto_debug");

У меня проблема с запросом graphQLвозвращает пустой массив, и запрос отлично работает в MongoDB.

В этом приложении запущено 5 скриптов скребка.2 сделаны на Python и 3 сделаны на Javascript.

Всего в MongoDB есть 11 коллекций, которые запрашиваются с помощью GraphQL.9 из 11 работают без проблем.

Обе рассматриваемые коллекции находятся в сценариях Python, использующих pymongo.Я опубликую код для одного из двух, поскольку оба они похожи по структуре.

Я действительно ударил стену в этот момент и перепробовал все, что я могу придумать, и не уверен, где отладку найтиисточник этой проблемы.

То, что я пробовал:

  • typeof для полей в mongodb строковые, там все выглядит нормально
  • различные формы cryptoDebugModel.запрос find () в конечной точке graphQL
  • удаление даты, dateOfIssue в скрипте python, чтобы увидеть, есть ли проблема в pymongo / string (но если она отображается как строка в mongoDB, то это не должно быть проблемой?)
  • переименование db / collection для учета возможного множественного сценария

Как я уже сказал, 9 из 11 работают без проблем, и все идеи с низко висящими фруктами имеютбыли исчерпаны, такие как опечатки, повторяющиеся имена и т. д.

Запрос выглядит нормально в консоли mongoDB, но возвращает пустой массив в запросе graphQL, поэтому любая помощь будеточень признателен.

Я могу предоставить полный код, если требуется, стараясь сделать проблему максимально краткой.

Это изображение запроса mongoDB crypto_debug.
Это изображение typeof для запроса mongoDB crypto_debug.
Это изображение графика graphQL для crypto_debug.


        import pymongo
        client = MongoClient()

        db = client['crypto'] # prices.update_one and prices.insert_one work fine here
        prices = db.crypto_data_prices

        db2 = client['cryptoDebug']
        debug = db2.crypto_debug

    ...
    try:
    ...
    except:
                e = str( sys.exc_info()[0] )

                name = str( 'Cryptocurrency' )
                dateOfIssue = str( "{:%B %d, %Y}".format(datetime.now()) )
                error = str( 'Error with updating database: %s' % e )

                debug.insert_one(
                    {
                        'name' : name,
                        'dateOfIssue' : dateOfIssue,
                        'error' : error
                    }
                )


const mongoose = require("mongoose");

    const crypto_debug = mongoose.createConnection('mongodb://localhost/cryptoDebug', {useNewUrlParser: true});

    const topSearches_debug = mongoose.createConnection('mongodb://localhost/googleSearchesDebug', {useNewUrlParser: true});

    Promise.all([bandcamp, crypto, newMovies, newOnSteam, topSearches, upcomingSneakers,
                 bandcamp_debug, crypto_debug, newMovies_debug, topSearches_debug, upcomingSneakers_debug]).then(() => {

    // model and type for crypto debug data
    //----------------------------------------------------------------
    const cryptoDebugModel = crypto_debug.model("crypto_debug",
        {
            name : String,
            dateOfIssue: String,
            error: String
        });



    const cryptoDebugType = new GraphQLObjectType({
            name: "crypto_debug_records", 
            fields: { 
                name: { type: GraphQLString },
                dateOfIssue: { type: GraphQLString },
                error: { type: GraphQLString }
            }
        });

// model and type for top searches debug data
//----------------------------------------------------------------
const topSearchesDebugModel = topSearches_debug.model("top_searches_debug",
    {
        name: String,
        dateOfIssue: String,
        error: String
    });



const topSearchesDebugType = new GraphQLObjectType({
        name: "top_searches_debug_records", 
        fields: { 
            name: { type: GraphQLString },
            dateOfIssue: { type: GraphQLString },
            error: { type: GraphQLString }
        }
    });

//.......

const schema = new GraphQLSchema({
        query: new GraphQLObjectType({
            name: "Query", 
            fields: {
//...
crypto_debug: {
                    type: GraphQLList(cryptoDebugType),
                    resolve: (root, args, context, info) => {
                        return cryptoDebugModel.find().sort({_id : -1}).exec();
                        }
                    },
top_searches_debug: {
                    type: GraphQLList(topSearchesDebugType),
                    resolve: (root, args, context, info) => {
                        return topSearchesDebugModel.find().sort({_id : -1}).exec();
                    }
                }, 
//.........

...