我找到了如何將異步功能放入路由器端點并嘗試實作它但沒有成功的方法。例如這個鏈接zellwk.com
服務器僅發送空字串而不是打開的大字串snippet.host。
async function downloadData(url) {
const options = {
'method': 'GET', 'url': url, 'headers': {}, formData: {}
};
let result = '';
await request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body)
result = response.body
});
return {error: 0, text: result}
}
app.get('/token/:token', jsonParser, async function (req, res) {
console.log(req.params.token) //Don't mind this token
try {
let message = await downloadData('https://snippet.host/xgsh/raw')
res.send(message)
} catch (e) {
console.log(e);
res.sendStatus(500);
}
});
如何讓它等待下載?
編輯
我實施node-fetch并得到了這個:
{"error":0,"text":{"size":0}}
我做錯了什么?
async function downloadData(url) {
const result = await fetch(url)
return {error: 0, text: result}
}
app.get('/token/:token', jsonParser, async function (req, res) {
console.log(req.params.token)
try {
let message = await downloadData('https://snippet.host/xgsh/raw')
res.send(message)
} catch (e) {
console.log(e);
res.sendStatus(500);
}
});
uj5u.com熱心網友回復:
在 fetch 呼叫的情況下,需要首先決議您缺少的回應正文。
async function downloadData(url) {
const res = await fetch(url)
if (res && res.status != 200)
throw new Error("status code other than 200 received")
let json = await res.json()
return {error: 0, text: json}
}
app.get('/token/:token', async function (req, res) {
console.log(req.params.token)
try {
let message = await downloadData('https://snippet.host/xgsh/raw')
// let json = await message.json()
res.send(message)
} catch (e) {
console.log(e);
res.sendStatus(500);
}
});
我嘗試呼叫 api 但每次它都回傳 404 。所以在這種情況下不能呼叫json。但是如果回傳 200,那么你呼叫 json 并相應地回傳它。
uj5u.com熱心網友回復:
你只能做出有用await的承諾。
request不回傳承諾,而是采用回呼函式。
這是兩年前request被棄用的原因之一。
替換request為支持 promise 的東西,例如node-fetch、最近添加到 Node.js的本機 fetch或axios。
uj5u.com熱心網友回復:
如果您必須使用request(即使它已被棄用);或者,如果您發現與不回傳承諾的舊函式類似的情況;你可以把你的request變成一個回傳承諾的函式。
要么撰寫自己的包裝器,形式為
function requestPromise(options) {
return new Promise(
(resolve,reject) => request(options,
(err,response) => if (err) reject(err) else resolve(response)));
}
或者,假設請求的回呼是 function(err,response) 的形式,直接使用util.promisify
async function xxxx(...) {
try {
...
let response = await util.promisify(request)(options);
...
}
uj5u.com熱心網友回復:
因為request它實際上不是async回傳 a 的函式,所以Promise您可以創建自己async的request.
function asyncRequest(options) {
return new Promise((resolve, reject) => {
request(options, (err, response) => {
if (err) {
reject(err)
} else {
resolve(response)
}
})
})
}
然后在您的專案中將您的downloadData函式重寫為:
async function downloadData(url) {
const options = {
method: "GET",
url: url,
headers: {},
formData: {},
}
const result = await asyncRequest(options)
return { error: 0, text: result.body }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442613.html
上一篇:如何在API中插入影像?
下一篇:如何解構陣列/物件
