2015-10-13 53 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