hapi 插件为基于 RESTful 和查询字符串的 API 提供模拟
注意:对该项目的支持已结束
该项目由沃尔玛拥有和维护。该项目已结束,沃尔玛不再支持该项目。
我们将不再监控该项目的问题或审查拉取请求。您可以根据该项目的许可条款或分支继续使用该项目,并自行承担风险。该项目不再受到沃尔玛的错误赏金计划或其他安全监控。
我们建议您采取以下措施:
出于安全原因,沃尔玛不会将我们在 Github 或其他平台上的主要存储库的所有权转让给其他个人/组织。此外,我们不会转让公共包管理系统的包所有权。
如果您想分叉此包并继续开发,您应该为项目选择一个新名称并创建您自己的包、构建自动化等。
请查看该项目的许可条款,即使在退役后,这些条款仍然有效。##curved-carousel
创建具有可选曲率的无限滚动轮播的简单方法。
以下选项可用于配置。
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 ) ;
} ) ;