Последующий учебник по GraphQL / объект Resolver для запроса базы данных MySQL завершился неудачно - PullRequest
0 голосов
/ 25 июня 2019

Разрабатывая полностью локально, я следовал руководству здесь: https://scotch.io/tutorials/super-simple-graphql-with-node#toc-creating-the-graphql-server

Вряд ли какая-либо модификация, только чтобы ограничить фокус таблицей "product".Нет таблицы «Пользователь» или «Рецепт».

Похоже, единственная проблема, с которой я столкнулся, - это получение данных из БД MySQL.

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

Если я изменю «return» на {«name»: «test»}, данные передаются на мой локальный компьютер.Панель инструментов GraphQL отлично.

models / index.js

'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
    sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
    sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs.readdirSync(__dirname).filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
}).forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
}); //console.log(db);                                                                                                                                                      Object.keys(db).forEach(modelName => {                                                                                                                                    if (db[modelName].associate) {                                                                                                                                            db[modelName].associate(db);                                                                                                                                          }                                                                                                                                                                     });                                                                                                                                                                                                                                                                                                                                             db.sequelize = sequelize;                                                                                                                                               db.Sequelize = Sequelize;                                                                                                                                                                                                                                                                                                                       
module.exports = db;
'use strict';
module.exports = (sequelize, DataTypes) => {
    const Product = sequelize.define('Product', {
        name: DataTypes.STRING,
        urlWordRef: DataTypes.STRING,
        seoTitle: DataTypes.STRING,
        seoDescription: DataTypes.STRING,
        standardEquipment: DataTypes.STRING,
        technicalSpecs: DataTypes.STRING
    }, {});
    Product.associate = function(models) {
        // associations can be defined here
        //Product.hasMany(models.RefProductOptions)
    };
    return Product;
};  
// src/resolvers.js
const resolvers = {               
    Query: {
        async products (root, { id }, { models }) {
            return models.Products.findById(id) // *** THE LINE OF CODE WHICH FAILS ***
            return {"name":"test"} // ** SUBSTITUTING THE ABOVE LINE WITH THIS - SUCCESS!  ***
        }       
    }     
}                                    
module.exports = resolvers  
// src/schema.js
const { gql } = require('apollo-server')
const typeDefs = gql `
    type Products {
        id: Int!
        name: String
        urlWordRef: String
        seoTitle: String
        seoDescription: String
        standardEquipment: String
        technicalSpecs: String
    }
    type Query {
        products(id: Int!): Products
    }
`;
module.exports = typeDefs   
// src/index.js
const { ApolloServer } = require('apollo-server')
const typeDefs = require('./schema')
const resolvers = require('./resolvers')
const models = require('../models')
const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: { models }
})
server.listen({port: 4000}).then(({ url }) => console.log('Server is running on localhost:4000'))  

Запрос GraphQL через панель инструментов:

{
  products(id: 1) {
    name
  }
}

Я ожидаю, что смогу передать идентификатор через указанный выше запрос GRaphQL и получить правильный результат строки таблицы.

Увы, я готов начать кодирование с помощью своего лба!


Ошибка ответа в GraphQL:

{
  "errors": [
    {
      "message": "Cannot read property 'findById' of undefined",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "products"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "TypeError: Cannot read property 'findById' of undefined",
            "    at products (/home/bob/graphql-server/src/resolvers.js:6:26)",
            "    at field.resolve (/home/bob/graphql-server/node_modules/graphql-extensions/dist/index.js:140:26)",
            "    at resolveFieldValueOrError (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:486:18)",
            "    at resolveField (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:453:16)",
            "    at executeFields (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:294:18)",
            "    at executeOperation (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:238:122)",
            "    at executeImpl (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:85:14)",
            "    at Object.execute (/home/bob/graphql-server/node_modules/graphql/execution/execute.js:62:35)",
            "    at /home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:239:46",
            "    at Generator.next (<anonymous>)",
            "    at /home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:7:71",
            "    at new Promise (<anonymous>)",
            "    at __awaiter (/home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:3:12)",
            "    at execute (/home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:218:20)",
            "    at Object.<anonymous> (/home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:156:42)",
            "    at Generator.next (<anonymous>)",
            "    at fulfilled (/home/bob/graphql-server/node_modules/apollo-server-core/dist/requestPipeline.js:4:58)",
            "    at <anonymous>",
            "    at process._tickCallback (internal/process/next_tick.js:188:7)"
          ]
        }
      }
    }
  ],
  "data": {
    "products": null
  }
}
...