這是我20年C++後的第一個node.js web應用程序,我想我只需要有人在這裏指出我朝着正確的方向。從Sequelize getter方法訪問關聯表
我正在寫一個處理學校和學生的應用程序的服務器端。當客戶端爲特定學生髮送請求(通過我的REST API)時,我想要返回學生的姓名和學校。我使用一個稱爲epilogue的庫來解析請求,通過sequelize讀取/寫入MySQL數據庫,並將結果包裝在JSON響應中。它會發送我爲學生定義的所有字段以及我定義的任何獲得者的值。一切都很好。我已經能夠使用epilogue進行POST,PUT,GET並且通常保持MySQL數據庫更新。
但是,當我試圖定義一個返回學生學校名稱的getter方法時,情況變得棘手。爲了做到這一點,我必須在學校桌上查看記錄並獲得學校名稱。
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()是異步的,這樣看來我將不得不使用。然後訪問結果。承諾是我的一個新的概念,但我已經試過喜歡的東西:
SchoolName: function {
return this.getSchool.then(function(school) {
return school.SchoolName;
});
}
但似乎這只是返回的承諾本身,而不是承諾,因爲承諾」不是個結果t在吸氣劑返回時完成。所以,我結束了在客戶端發送類似:
{
"FullName": "John Doe",
"SchoolName": {
"isFulfilled": false,
"isRejected": false
},
"id":1,
"FirstName":"John",
"LastName":"Doe"
}
好像這裏的干將必然是同步的,所以它看起來像我只是需要一些方法來告訴吸氣停止,並等到Promise完成,然後返回值。但是這似乎違反了node.js的異步特性。所以,我有一種預感,我基本上誤解了sequelize.js或node.js或promises或甚至數據庫設計的重要內容。有人可以重定向我嗎?主要是,我想知道:什麼是正確方式做到這一點?
是的!就是這樣!我所要做的就是在創建資源時添加「association:true」,然後從getter中返回this.School.SchoolName。這正是我需要的。謝謝! –
@JeffWilhite你究竟在哪裏放置'association:true'? –
@noodles_ftw您是否也在使用epilogue或其他任何包來處理REST API?我使用koa.js(而不是express.js)和sequelize和koa路由器進行路由,並且由於koa基於生成器(用於ES6),或者等待/異步(用於ES7),所以'yield' /'async/await '爲我工作。 – artificis