javascript - 请求不适用于响应正文中的 URL
问题描述
请求不适用于我从响应正文中获得的 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
准确在您的客户端和服务器上都以相同的方式......没有客户端库。)
第二 ...
如果我将完全相同的打印 URL 字符串放入请求 URL 中,它会以某种方式工作,但如果我直接从响应正文中获取它,它就不起作用。
这表明您没有看到响应正文中的某些内容。例如,在 URL 的开头可能有一个换行符,或一些其他特殊/不可见的文本字符。如果是这样,那可以解释你的问题。
要调试,我建议并排记录它们:
console.log(csvURL, '*PRINTED URL*')
看看你是否能观察到任何差异。
你也可以尝试检查.length
两个字符串,或者做一个csvUrl.trim()
看看是否有帮助。最终,您的结果告诉您这两个字符串不相同......因为如果它们是,那么您的结果也将是。
推荐阅读
- json - npm install 无法从每个依赖项的依赖项中找到 package.json
- contiki - Contiki-ng:在 Cooja 中嗅探邻居数据包并像普通节点一样响应/发送
- ios - 如何更改 Driver 类型的属性的值
使用 Driver 类型的属性 ? - javascript - HashRouter 和 Google Analytics 无法跟踪单个路径
- python - 通过 Python 套接字发送 Zip 文件夹
- vue.js - 从 JavaScript 调用时,Vuetify 路由器不起作用?
- c# - 是否应将公司或工具包缩写用作 C# 类名称和方法的前缀
- jquery - jQueryUI Datepicker 在 Safari 浏览器中未正确显示
- c# - 如何使用 ROW_NUMBER() 限制从 SQL Server 返回的结果
- google-chrome - 如何在浏览器中自定义权限对话框?