我正在尝试围绕Node HTTP/S 模块请求编写一些包装器,而不使用 axios。node-fetch 或任何其他 3rd 方模块。
例如,我想有函数 ,,,sendGet
等sendPost
。在理想情况下,这些函数将实现核心函数,只是使用不同的参数。sendJSON
sendFile
makeRequest
我希望每个包装器都返回一个 promise,因此调用者可以对结果做任何事情。
我还希望包装器有一个参数,在失败的情况下请求重试多少次。
所以想法是这样的。到目前为止,我能够制作一个包装器并通过承诺。但我无法添加重试失败的能力。它应该是(在理想情况下)makeRequest
功能的一部分,但是当与 Promise 结合使用时,我无法这样做。谢谢你的想法
// intended usage of wrapper
sendGet('http://example.com', 3).then().catch()
// wrapper applies makeRequest fnc with various arguments
const sendGet = (url, retries) => {
return makeRequest('GET', url, retries)
}
const sendPost = (url, retries) => {
return makeRequest('POST', url, retries)
}
// core function
const makeRequest = async (method, url, retries = 0) => {
// returns reject on bad status
// returns resolve with body on successful request
return new Promise((resolve, reject) => {
const options = {/*method, hostname, etc */};
const request = http.request(options, (response) => {
let chunks = [];
if (response.statusCode < 200 || response.statusCode >= 300) {
return reject('bad status code')
}
// collect data
response.on('data', (chunk => {
chunks.push(chunk)
}))
// resolve on end of request
response.on('end', () => {
let body = Buffer.concat(chunks).toString();
return resolve(body)
})
})
request.end();
})
}