我正在開發我自己的 api,使用 Express 和 Node JS,我正在制作一些回傳有趣的貓影像的東西。這是我在隨機有趣的貓影像的地方。
app.get("/media/bigfootjinx", (req, res, next) => {
let file = Math.floor(Math.random()*catarray.length)
let fileurl = catarray[file]
let fileimg = fetch(fileurl)
let img = Buffer.from(fileimg, 'base64');
res.writeHead(200, {
'Content-Type': 'image/png',
'Content-Length': img.length
});
res.end(img);
});
我的目標是獲取一個隨機的貓影像,它們都在 png 中并鏈接到一個不和諧的 CDN。我不斷得到的錯誤是這個。
TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Promise
at Function.from (buffer.js:330:9)
at /home/runner/api/index.js:21:22
at Layer.handle [as handle_request] (/home/runner/api/node_modules/express/lib/router/layer.js:95:5)
at next (/home/runner/api/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/runner/api/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/runner/api/node_modules/express/lib/router/layer.js:95:5)
at /home/runner/api/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/runner/api/node_modules/express/lib/router/index.js:335:12)
at next (/home/runner/api/node_modules/express/lib/router/index.js:275:10)
at expressInit (/home/runner/api/node_modules/express/lib/middleware/init.js:40:5)
如果有人好奇,我正在使用 replit node.js 專案。
uj5u.com熱心網友回復:
fetch 是一個 promise,所以你需要等待 fetch 并回傳一個 blob 回應
app.get("/media/bigfootjinx", async (req, res, next) => {
let file = Math.floor(Math.random()*catarray.length)
let fileurl = catarray[file]
let response = await fetch(fileurl)
let fileimg = await response.blob()
let img = await blobToBase64(fileimg);
res.writeHead(200, {
'Content-Type': 'image/png',
'Content-Length': img.length
});
res.end(img);
});
從 blob 到 base64 函式的轉換:
function blobToBase64(blob) {
return new Promise((resolve, _) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.readAsDataURL(blob);
});
}
uj5u.com熱心網友回復:
以下代碼行導致錯誤:
let img = Buffer.from(fileimg, 'base64');
let fileimg = fetch(fileurl)
該fetch()函式回傳一個Promise<Buffer>. 您只需要等待獲取結果。你可以這樣實作:
let fileimg = await fetch(fileurl)
let img = Buffer.from(fileimg, 'base64');
注意: get 端點的回呼函式必須是異步的:
app.get("/media/bigfootjinx", async (req, res, next) => {
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/364488.html
標籤:javascript 节点.js http
