req.options
是一個字典(plain JavaScript object),其中包含可在您應用程式的 actions 中使用的、與請求無關的設定。
req.options
的目的是讓 action 的程式碼可以存取其設定的路由選項(如果有的話)。(簡單來說,「路由選項」只是在路由目標中提供的任何額外屬性。)
Sails 中的路由選項最初被設計成一種更彈性的方式,用來設定內建的藍圖 actions。
有些特殊的設定必須始終提供給特定的藍圖 actions。這提供了一種方式,讓您的應用程式可以溝通藍圖 action 應該以哪個模型/關聯為目標。例如,req.options.model
是特定藍圖 action 應該以目標模型的身分識別。而對於直接涉及關聯的藍圖 action,req.options.alias
指示關聯屬性的名稱。
您可以在您的應用程式中利用這一點,將藍圖 action 綁定到任意的自訂路由。例如,考慮 config/routes.js
中的以下自訂路由
'GET /foo/bar': {
action: 'user/find',
model: 'user'
}
每當對 /foo/bar 發出 GET 請求時,find
藍圖 action 將會執行,並且 req.options.model
將以 user
的形式提供。(這就是內建的、通用的「find」藍圖 action 知道它應該與 User 模型溝通的方式。)
需要進一步自訂藍圖 actions 嗎?在大多數情況下,最簡單(且最容易維護)的方法是編寫自訂 action。如果您是第一次在藍圖 API 和編寫自己的自訂 actions 之間進行轉換,您可以先查看概念 > Actions & Controllers。
請注意,有一種中間方法可以讓您以程式化的方式修改藍圖 action 行為的一些其他方面,而無需完全覆蓋它(例如,檢查請求以確定藍圖 action 在存取模型時使用的標準)。如需更多資訊,請參閱參考 > sails.config.blueprints > 使用 parseBlueprintOptions。
也可以設定和使用您自己的自訂路由選項。例如,假設您正在為 Sails 建構一個 GitHub 外掛程式。為了支援處理來自 GitHub 的 webhook 請求,您的外掛程式可以註冊一個通用的、可設定的 action,例如 github/receive-event
,這允許您的外掛程式的任何使用者輕鬆地將其綁定到他們應用程式中的任何路由
'POST /my-cool-webhooks/github/doings-and-things/incoming': {
action: 'github/receive-event',
}
但是現在,假設您的外掛程式的通用 receive-event
action 的目的之一是將代表傳入 GitHub 事件的記錄儲存到應用程式的資料庫中(例如,為了將來使用而追蹤它)。為了做到這一點,您的通用 action 需要知道要使用哪個模型。因此,使用與 Sails 內建藍圖 action 一致的簡單方法,您的外掛程式可以支援如下用法
'POST /my-cool-webhooks/github/doings-and-things/incoming': {
action: 'github/receive-event',
model: 'repoactivity'
}
同時,在您的外掛程式中,您註冊的 action 可能看起來像這樣
module.exports = function receiveEvent(req, res) {
if (_.isUndefined(req.options.model) || !sails.models[req.options.model]) {
return res.serverError(new Error('Invalid configuration: To use `github/receive-event`, please set this route's `model` to the identity of one of your app\'s models. (Currently, it is `'+req.options.model+'`, which cannot be used.)'));
}
var GitHubEventModel = sails.models[req.options.model];
GitHubEventModel.create({
raw: req.allParams(),
githubId: req.param('id'),
// ...
// ... etc. (see https://developer.github.com/webhooks/#events)
}).exec(function(err) {
if (err) { return res.serverError(err); }
return res.ok();
});
};
有關建立此類型外掛程式的更多資訊,請參閱概念 > 擴展 Sails > Hooks。