请求不适用于响应正文中的 URL

Request doesn't work with URL from Response Body

请求不适用于我从响应正文中获得的 URL。 URL 在控制台中打印正常,但使用它就是行不通

request.post(`https://onesignal.com/api/v1/players/csv_export?app_id=${constants.ONESIGNAL_APPID}`, {
    json: {
        "extra_fields": ["country"]
    }, headers: constants.AUTH_HEADER
}, (error, res, body) => {
    if (error) {
        reject(error)
        return
    }
    
    console.log(body)

    var csvURL = body.csv_file_url
    console.log(csvURL)

    request(csvURL) // <--- Request doesn't work with the csvURL from body
    .pipe(fs.createWriteStream("./ji.csv.gz", { encoding: 'binary'}))

这根本行不通!如果我将完全相同的打印 URL 字符串放入请求 URL 中,它会以某种方式工作,但如果我直接从响应主体中获取它,它就不会工作。

这是正文输出:

{
    csv_file_url: 'https://onesignal.s3.amazonaws.com/csv_exports/theappid.csv.gz'
}

我也试过用 axios 代替 request 但还是不行

更新:使用 node-fetch 也不起作用

async function getAllCountries() {
    return new Promise((resolve, reject) => {
        fetch(`https://onesignal.com/api/v1/players/csv_export?app_id=${constants.ONESIGNAL_APPID}`, {
        method: 'post',
        body:    JSON.stringify({ extra_fields: ["country"] }),
        headers: { 'Authorization': 'Basic ****', 'Content-Type': 'application/json' },
    })
    .then(res => res.json())
    .then(json => {
        const csvURL = json.csv_file_url
        
        console.log(csvURL)
        
        fetch(csvURL)
        .then(
            res => {
                const dest = fs.createWriteStream("./ji.csv.gz");
                res.body.pipe(dest);
                res.body.on("end", () => {
                    gunzip('ji.csv.gz', 'ji.csv', async () => {
                        
                        const usersCSVJSON = await csv().fromFile("ji.csv");
                        const onlyCountriesArray = usersCSVJSON.map((value) => { return value.country })
                        const singleCountries = new Set(onlyCountriesArray)
                        resolve([...singleCountries])
                    })
                });
                dest.on('error', (error)=> {
                    console("ERRORR")
                })
            })
        })
    })
}
```

首先,您不需要任何特殊的库,如 Request 或 Axios,即可完成 AJAX。您只需要(内置)fetch 方法(有关详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)。

(注意: 在 Node 上你需要一个库,例如 https://www.npmjs.com/package/node-fetch,因为遗憾的是它没有内置的 fetch。但是通过使用这样的库然后,您可以 fetch 在客户端和服务器上以完全相同的方式...无需客户端库。)

第二...

If i put the exact same printed URL string and put inside the request URL it works somehow, but if I take it from the response body directly it doesn't work.

这表明响应正文中有您没有看到的内容。例如,URL 的开头可能有换行符或其他一些 special/invisible 文本字符。如果是这样,那就可以解释你的问题了。

为了调试,我建议并排记录它们:

console.log(csvURL, '*PRINTED URL*')

看看你是否能观察到任何差异。

您也可以尝试检查两个字符串的 .length,或执行 csvUrl.trim() 以查看是否有帮助。但最终,您的结果告诉您这两个字符串 相同......因为如果它们是相同的,那么您的结果也会是。

直接使用 url 时,文件尚未在服务器上创建,因此无法使用。我需要延迟该功能,所以现在可以使用了