src/httpGetJson.mjs

/**
 * httpGetJson
 *
 * 以內建fetch(node>=18與現代瀏覽器皆內建)執行GET, 並比照axios.get之回應與錯誤語意:
 * - 2xx: resolve {data}, data為回應內容(JSON可解析則為物件, 否則保留原字串)
 * - 非2xx: reject Error('Request failed with status code {status}')
 * - 網路層錯誤(連線失敗/DNS/中斷): fetch自身reject向外傳遞
 *
 * 注意與axios之已知差異: node端fetch不讀取HTTP_PROXY/HTTPS_PROXY環境變數(axios會),
 * 需經proxy連線SSO之部署環境不適用本函數
 *
 * @param {String} url 輸入請求網址字串
 * @returns {Promise} 回傳Promise, resolve回{data}, reject回錯誤訊息
 */
async function httpGetJson(url) {

    //fetch, 網路層錯誤時reject向外傳遞
    let res = await fetch(url)

    //check, 比照axios預設validateStatus, 非2xx視為錯誤
    if (!res.ok) {
        return Promise.reject(new Error(`Request failed with status code ${res.status}`))
    }

    //text
    let txt = await res.text()

    //data, 比照axios: JSON可解析則轉物件, 否則保留原字串
    let data = txt
    try {
        data = JSON.parse(txt)
    }
    catch (err) {}

    return { data }
}


export default httpGetJson