Узел JS, как я могу использовать Squlize.create точно

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

Я пытаюсь решить это примерно 1 день назад. Почему моя асинхронная функция не ожидает результатов? Данные правильно вставлены в базу данных, но graphql не получает результаты до завершения запроса.

 const resolvers = {
    register: async (
        parent,
        { contact_name, username, password },
        { models }
    ) => {
        const user = {
            contact_name,
            username,
            password
        };
        const registeredUser = await models.Member.create(user)

        try {
            if (typeof registeredUser.member_key === 'number') {
                return true;
            } else {
                return false;
            }
        } catch (error) {
            throw new Error(error);
        }
    }
    Member: {
        config: (parent, args, { models }) => {
            return models.Config.findAll({
                where: {
                    member_key: parent.member_key
                }
            });
        }
    }
}
 

Если я console.log сразу после const registeredUser = await models.Member.create(user) того, как получу следующее:

 member {
    dataValues:
       { member_key: null,
         contact_name: 'Alex',
         username: 'tornado',
         password:
          '$2b$12$6MKWx.LUXXXaIHHIFUp1DuOMkMNLc76HcvTN6ZayLv.a7iG70O3JK' },
      _previousDataValues:
       { contact_name: 'Alex',
         username: 'tornado',
         password:
          '$2b$12$6MKWx.LUXXXaIHHIFUp1DuOMkMNLc76HcvTN6ZayLv.a7iG70O3JK',
         member_key: null,
         member_type: undefined,
         email_address: undefined },
      _changed:
       { contact_name: false,
         username: false,
         password: false,
         member_key: false,
         member_type: false,
         email_address: false },
      _modelOptions:
       { timestamps: false,
         validate: {},
         freezeTableName: true,
         underscored: false,
         paranoid: false,
         rejectOnEmpty: false,
         whereCollection: null,
         schema: null,
         schemaDelimiter: '',
         defaultScope: {},
         scopes: {},
         indexes: [],
         name: { plural: 'members', singular: 'member' },
         omitNull: false,
         sequelize:
          Sequelize {
            options: [Object],
            config: [Object],
            dialect: [MysqlDialect],
            queryInterface: [QueryInterface],
            models: [Object],
            modelManager: [ModelManager],
            connectionManager: [ConnectionManager],
            importCache: [Object],
            test: [Object] },
         hooks: { beforeCreate: [Array] } },
      _options:
       { isNewRecord: true,
         _schema: null,
         _schemaDelimiter: '',
         attributes: undefined,
         include: undefined,
         raw: undefined,
         silent: undefined },
      isNewRecord: false,
      null: 34490 }
 

и в последней строке кода member_key указан, но не обновляется в значениях данных, я точно делаю что-то не так, но я понятия не имею, что.
КСТАТИ, member_key — это обычный идентификатор, настраиваемый только для отражения моей старой базы данных 🙂

И проблема с этим заключается в том, что запрос graphql также выдает мне ошибку, потому что он завершается до того, как я смогу получить результаты из базы данных, я полагаю, потому что await не работает в этой строке:

const RegisteredUser = ожидание моделей.Member.create(пользователь)

Ответ №1:

Мне удалось исправить это, вернув токен. Потому что мне все равно нужен токен во внешнем интерфейсе, поэтому я добавил member_key, username и contact_name для создания токена, чтобы они были у меня в токене.

Вот исправление мутации регистра, у некоторых других все еще возникает аналогичная проблема

 register: async (
    parent,
    { contact_name, username, password },
    { models, secret }
) => {
    const user = {
        contact_name,
        username,
        password
    };
    await models.Member.create(user);
    const member = await models.Member.findOne({
        where: { username }
    });

    if (!member) {
        throw new Error('There is a problem with the registration');
    }
    return {
        token: createToken(member, secret, '30m')
    };
},
 

также добавьте недостающие поля для создания токена для меня, это member_key и имя контакта, вот измененный знаковый токен

 const createToken = (user, secret, expiresIn) => {
    const { member_key, contact_name, username } = user;
    return jwt.sign({ member_key, contact_name, username }, secret, {
        expiresIn
    });
};