1. 程式人生 > >Sail.js官方文件閱讀筆記(四)——api/models/ 目錄

Sail.js官方文件閱讀筆記(四)——api/models/ 目錄

Model代表了一組結構化資料,稱之為記錄。Model通常對應了資料庫裡的一張表或集合,屬性對應了列或域,記錄對應了行。結構如下圖:

4.1 models定義

model檔案一般定義在上圖的models資料夾中,例子如下:

// api/models/Product.js
module.exports = {
  attributes: {
    nameOnMenu: { type: 'string', required: true },
    price: { type: 'string', required: true },
    percentRealMeat: { type: 'number', defaultsTo: 20, columnType: 'FLOAT' },
    numCalories: { type: 'number' },
  },
};

4.2 使用models

Sails引用啟動之後,model檔案就會被各種後端程式碼使用。這使程式碼通過models的方法與資料庫進行通訊。

Model中有很多可用的內建方法,最重要的比如find()和create()。

4.3 請求方法

Sails中的每個model都有一組方法暴露出來執行你呼叫來與資料庫互動。這是與應用資料互動最基礎的方法。

因為經常需要向資料庫發請求然後等待響應,大多數model方法都是非同步的。也就是說不能立即得到響應。就像其他JS的非同步邏輯一樣,需要在執行完成之後有一些通知方法。

通常,推薦用來處理此情況的方法是用async/await。

4.4 資源釋出訂閱方法

Sails有一些資源的釋出訂閱方法,為一些用動態空間進行簡單實時的操作而設定的。

4.5 定製的model方法

定製的model方法對推斷與一個特定model關聯的controller程式碼十分有用,它允許你將程式碼拉出controller到可以複用的地方。

定製的model方法可能同步也可能非同步,但多半是非同步。非同步的model中的方法必須是非同步的。例如:

// in api/models/Monkey.js...

// Find monkeys with the same name as the specified person
findWithSameNameAsPerson: async function (opts) {
    var person = await Person.findOne({ id: opts.id });

    if (!person) {
        throw require('flaverr')({
      message: `Cannot find monkeys with the same name as the person w/ id=${opts.id} because that person does not exist.`,
      code: 'E_UNKNOWN_PERSON'
    });
    }

    return await Monkey.find({ name: person.name });
}

4.5.1 例項方法

在Sails 1.0版本中,例項方法已經被移除。儘管例項方法在程式碼中有時候會比較方便,許多使用者發現它會引發意外結果和設計誤區。

一個更好的方法是使用定製的靜態model方法。這可以使你的方法更具備複用和通用性,因為這樣在沒有例項時依舊可達。

4.6 大小寫敏感

Sails 1.0版本中的請求不再大小寫敏感,而不用考慮資料庫的處理。這極大地提高了請求效能和資源索引。大多數資料庫初始是大小寫敏感的,要向改變它必須對資料庫進行一定的修改。