2015-10-13 107 views
3

这是我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或甚至数据库设计的重要内容。有人可以重定向我吗?主要是,我想知道:什么是正确方式做到这一点?

回答

2

是的,getSchool()方法返回一个承诺。你需要让后续查询包含关联。你可以通过手动创建一个新的webservice并输入你自己的序列化查询,或者通过告诉epilogue做到这一点,如果可以的话。看看unit test in the epilogue code。也许你可以添加选项:associations: true以加载关联。

+0

是的!就是这样!我所要做的就是在创建资源时添加“association:true”,然后从getter中返回this.School.SchoolName。这正是我需要的。谢谢! –

+2

@JeffWilhite你究竟在哪里放置'association:true'? –

+0

@noodles_ftw您是否也在使用epilogue或其他任何包来处理REST API?我使用koa.js(而不是express.js)和sequelize和koa路由器进行路由,并且由于koa基于生成器(用于ES6),或者等待/异步(用于ES7),所以'yield' /'async/await '为我工作。 – artificis