hapi 插件為基於 RESTful 和查詢字串的 API 提供模擬
注意:對該專案的支援已結束
該項目由沃爾瑪擁有和維護。該計畫已結束,沃爾瑪不再支持該計畫。
我們將不再監控該項目的問題或審查拉取請求。您可以根據該項目的授權條款或分支繼續使用該項目,並自行承擔風險。該項目不再受到沃爾瑪的錯誤賞金計劃或其他安全監控。
我們建議您採取以下措施:
出於安全原因,沃爾瑪不會將我們在 Github 或其他平台上的主要儲存庫的所有權轉讓給其他個人/組織。此外,我們不會轉讓公共包管理系統的包所有權。
如果您想分叉此套件並繼續開發,您應該為專案選擇一個新名稱並建立自己的套件、建置自動化等。
請查看該專案的授權條款,即使在退役後,這些條款仍然有效。
創建具有可選曲率的無限滾動輪播的簡單方法。
以下選項可用於配置。
apiPrefix
表示應模擬的路由基礎的字串或字串陣列
預設為/api
mocksDir
包含模擬檔的目錄。
預設為__dirname + './mocks'
,其中 __dirname 是這個插件
mocksAdminPath
可以找到此外掛程式管理頁面的相對 URL。
預設為/admin/mocks
mocksAdminServerLabels
hapi 外掛程式註冊期間使用的標籤數組
預設為['admin']
enabled
無論是否啟用模擬。
預設為false
enableForceCookiePage
一個布林值,表示是否註冊 cookie 設定器頁面。此頁面提供了一個簡單的按鈕來開啟或關閉always_ridicule
cookie,它允許客戶端選擇強制類比回應,而不管伺服器設定如何。對於新手測試人員或書籤創建很麻煩的設備很有用。預設為false
forceCookiePath
可以在其中找到 cookie 設定器頁面的相對 URL。
預設為/cookie
forceCookieValue
表示always_ridicule
cookie 值的字串。允許伺服器擁有公開可用的選擇加入模擬方法,而無需公開已知的特定必要 cookie。 expires
值是自設定時間起 30 分鐘。
預設為"true"
在您的mocksDir
內部,建立一個ridicule.js
文件,在其module.exports
中公開一個數組hapi路由。
module . exports = [ {
method : 'GET' ,
path : '/hello' ,
handler : function ( request , reply ) {
reply ( 'hello world' ) ;
}
} , {
method : 'POST' ,
path : '/goodbye' ,
handler : function ( request , reply ) {
reply ( 'thanks for all the fish' ) ;
}
} ]
在伺服器啟動時,所有配置的路由都使用隨機的 40 個字元前綴進行註冊。 (例如,路線/foo
被模擬為/(uuid)/foo
)
啟用模擬伺服器後,所有傳入請求都會與設定的apiPrefix
進行比對。當找到匹配項時,請求將在內部轉送到模擬路由處理程序。
您可以在處理程序中模擬請求時進行救助(當您僅模擬基於查詢字串的系統的子集時很有用,因為 hapi 僅在路徑上匹配)。只需在檔案中require
rididcule,然後呼叫ridicule.bailout(req, res)
,其中req
和res
是處理程式內部的請求和回應物件。
模擬請求最常見的方法是在路由處理程序的reply()
介面中傳回json 檔案的資料。
var data = require ( './mockFile.json' ) ;
var route = {
method : '*' ,
path : '/mockPath' ,
config : {
handler : function ( request , reply ) {
return reply ( data ) ;
}
}
} ;
但是,您可以為回應添加其他元數據,例如自訂標頭和 HTTP 狀態代碼。您只需將現有的 json 檔案包裝在另一個物件中,將原始檔案設為payload
,然後新增一個ridiculeSettings
欄位。
所以這個請求
{
"foo" : " bar "
}
變成
{
"ridiculeSettings" : {
"statusCode" : 418 ,
"headers" : { "Content-Type" : " x-stream " }
}
payload: {
"foo" : " bar "
}
}
值得注意的是,由於這是在 hapi 請求流的最後添加的,因此,由於payload
必須內聯在模擬文件中,因此僅限於僅支援字串和 JSON 對象,而不支援流或緩衝區。
可以透過三種方式啟用/停用模擬。
hapi 配置設定
您可以將設定中enabled
選項變更為true
。這在開始時啟用,但將來可以透過以下方式更改:
切換管理頁面按鈕
您可以透過存取mocksAdminPath
下配置的路徑隨時開啟或關閉模擬。預設情況下這是/admin/mocks
。請注意,這是在 hapi 標籤後面註冊的(可在您的設定中配置,但預設為['admin']
)。這允許您在生產網站中發送嘲笑,並將切換開關存在於不可公開訪問的連接埠上。
客戶端上的 cookie
如果使用客戶端上配置的forceCookieValue
(預設值為字串“true”,例如always_ridicule="true"
)中的值設定always_ridicule
,則將始終提供配置的模擬(當然,直到它被刪除) )。此外, always_ridicule=false
將強制客戶端永遠不會被模擬,無論伺服器的目前設定為何。
由於 hapi 僅符合路徑上的路由(而不是任何查詢字串參數),因此您需要能夠針對一條路徑匹配多個查詢。為此,ridicule 提供了ridicule.validate
方法。
ridicule.validate
是一個函數,它接受請求和回復對,然後是驗證對象,由validator
對象和callback
函數組成。
validator
物件是一個普通對象,其中每個鍵代表查詢字串的鍵,值可以是與查詢字串中對應值匹配的字串、RegExp 或函數。
例如,以下查詢字串
?category=Music&genre=ska&year=2012
將匹配以下驗證
...
handler : function ( request , reply ) {
ridicule . validate ( request , reply , {
validator : {
category : 'Music' ,
genre : function ( value ) {
return value === 'ska' || value === 'rocksteady'
} ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( { 'all' : 'good' } ) ;
}
} )
}
. . .
當然,您可以輕鬆連結多個檢查
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : {
foo : 'bar' ,
baz : 'biz'
} ,
callback : function ( request , reply ) {
reply ( { 'wordsAre' : 'hard' } ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
您可能會遇到這樣的問題:您想要在端點模擬請求的子集,但不是全部。在這種情況下,ridicule 提供了一個方便的輔助函數, ridicule.bailout
。
您需要做的就是將其新增至查詢檢查的末尾,透過處理程序request
和reply
介面。
var matched = queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
if ( ! matched ) {
ridicule . bailout ( request , reply ) ;
}
另一種方法是將最終查詢中的驗證器物件設為true
。這將自動匹配提供的查詢,並且可以充當包羅萬象的角色
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : true ,
callback : function ( request , reply ) {
reply ( ) . file ( './catchall.json' ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;