请求不适用于响应正文中的 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 时,文件尚未在服务器上创建,因此无法使用。我需要延迟该功能,所以现在可以使用了
请求不适用于我从响应正文中获得的 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 时,文件尚未在服务器上创建,因此无法使用。我需要延迟该功能,所以现在可以使用了