虽然这可能会或可能不会帮助您解决问题,但这里是如何在本地运行时模拟 Cognito。
每个 AWS 服务都接受一个配置。在此配置中,您可以传递 endpoint 参数。您可以将本地服务器传递给此配置,并为每个 aws 服务模拟您想要的响应。
export const getIdentityProvider = () => new CognitoIdentityServiceProvider({
region: process.env.AWS_REGION,
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
endpoint: process.env.IS_TEST ? 'http://localhost:5001' : null
})
AWS 服务执行 POST 调用,其中您发送的日期作为正文,函数名称作为 x=amz-target 标头的一部分。例如,AdminGetUser Cognito 调用具有标题:'x-amz-target': 'AWSCognitoIdentityProviderService.AdminGetUser'
您可以创建一个基本服务器来处理这个问题:
import http from 'http'
const getBody = async request => {
return new Promise((resolve, reject) => {
let body = ''
request.on('data', (data) => {
body += data
})
request.on('end', () => {
resolve(JSON.parse(body))
})
})
}
const server = http.createServer(async (req, res) => {
const body = await getBody(req)
const route = req.headers['x-amz-target']
let response
const status = 200
switch (route) {
case 'AWSCognitoIdentityProviderService.AdminGetUser':
response = { foo: 'bar' }
break
}
res.writeHead(response ? status : 404, { 'Content-Type': 'text/plain' })
res.write(response || 'No route found')
res.end()
})
server.listen(process.env.PORT || 5001, 'localhost', () => {
console.log(`Proxy server listening on port http://${server.address().address}:${server.address().port}`)
})
为了知道返回什么,我建议进行一些单元测试并使用nock 捕获响应。然后,您可以提取响应正文并在您的模拟服务器中使用它。