Это мое первое веб-приложение node.js после 20 лет C++, и я думаю, мне просто нужен кто-то, чтобы указать мне в правильном направлении.Доступ к связанной таблице из метода Sequelize getter
Я пишу серверную часть приложения, которое касается школ и студентов. Когда клиент отправляет запрос (через мой REST API) для конкретного ученика, я хочу вернуть первую и фамилию и школу учащегося. Я использую библиотеку под названием epilogue, которая анализирует запросы, читает/записывает в базу данных MySQL через sequelize и завершает результат в ответ JSON. Он отправит все поля, которые я определил для ученика, а также значения любых получателей, которые я определил. Все отлично работает. Я смог использовать эпилог для POST, PUT, GET и, как правило, обновлять базу данных MySQL.
Однако все было сложно, когда я попытался определить метод геттера, который возвращает имя школы ученика. Для этого мне нужно получить доступ к записи в школьном столе и получить название школы.
var school = sequelize.define("School", {
SchoolName: {
type: DataTypes.STRING,
},
}, {
classMethods: {
associate: function(models) {
school.hasMany(models.Student);
}
}
}
}
var student = sequelize.define("Student", {
FirstName: {
type: DataTypes.STRING,
},
LastName: {
type: DataTypes.STRING,
},
}, {
classMethods: {
associate: function(models) {
student.belongsTo(models.School);
},
},
getterMethods: {
FullName: function() {
return this.FirstName + ' ' + this.LastName; // This works just fine
},
SchoolName: function() {
return this.getSchool().SchoolName; // This doesn't work because getSchool is asynchronous
}
}
}
}
Проблема заключается в том, что .getSchool() является асинхронным, так что кажется, я должен был бы использовать .then для доступа к результату. Обещания новая концепция для меня, но я пытался что-то вроде:
SchoolName: function {
return this.getSchool.then(function(school) {
return school.SchoolName;
});
}
Но, кажется, это просто возвращает сам посыл вместо результатов обещание, потому что обещание ISN» t выполняется во время возвращения геттера. Итак, я в конечном итоге отправка клиенту что-то вроде:
{
"FullName": "John Doe",
"SchoolName": {
"isFulfilled": false,
"isRejected": false
},
"id":1,
"FirstName":"John",
"LastName":"Doe"
}
Похоже, что добытчики здесь обязательно синхронные, так это выглядит, как будто я просто нужен способ, чтобы сказать сорбент остановиться и дождаться выполнения обещания и затем вернуть значение. Но это, похоже, нарушает асинхронный характер node.js. Итак, у меня есть догадка, что я принципиально недопонимаю что-то важное о sequelize.js или node.js или обещаниях или, возможно, даже дизайне базы данных. Может кто-то перенаправить меня, пожалуйста? В основном, я хотел бы знать: что такое способ сделать это?
Да! Вот и все! Все, что мне нужно было сделать, это добавить «ассоциации: истина», когда я создаю ресурс, а затем вернуть this.School.SchoolName из получателя. Это именно то, что мне нужно. Благодаря! –
@JeffWilhite где именно вы помещаете 'ассоциации: true'? –
@noodles_ftw Вы тоже используете эпилог или любой другой пакет для обработки REST api? Я использую koa.js (вместо express.js) с sequelize и koa-router для маршрутизации, а так как koa основан на генераторах (для ES6) или await/async (для ES7), 'yield' /' async/wait 'работал на меня. – artificis