这是我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