#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
});
};