2015-10-13 2 views
3

Это мое первое веб-приложение 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 или обещаниях или, возможно, даже дизайне базы данных. Может кто-то перенаправить меня, пожалуйста? В основном, я хотел бы знать: что такое способ сделать это?

ответ

2

Да, метод getSchool() возвращает обещание. Вам нужно, чтобы запрос sequelize включал ассоциацию. Вы можете сделать это либо вручную, создав новый веб-сервис, либо разместив свой собственный запрос на продолжение, либо сообщив эпилог, чтобы сделать это, если это возможно. Посмотрите на unit test in the epilogue code. Возможно, вы можете добавить опцию: associations: true для загрузки ассоциаций.

+0

Да! Вот и все! Все, что мне нужно было сделать, это добавить «ассоциации: истина», когда я создаю ресурс, а затем вернуть this.School.SchoolName из получателя. Это именно то, что мне нужно. Благодаря! –

+2

@JeffWilhite где именно вы помещаете 'ассоциации: true'? –

+0

@noodles_ftw Вы тоже используете эпилог или любой другой пакет для обработки REST api? Я использую koa.js (вместо express.js) с sequelize и koa-router для маршрутизации, а так как koa основан на генераторах (для ES6) или await/async (для ES7), 'yield' /' async/wait 'работал на меня. – artificis

Смежные вопросы