javascript - Ladda ner fil i typescript i Node.js
Jag försöker ladda ner en fil med TypeScript (Node.js) med hjälp av node-fetch.
Enligt dokumentationen och ett svar på Stack Overflow här bör följande kod fungera:
public async downloadXMLFeed(): Promise<void>{
// function for download the file to
// a temporary location
let fileStream = fs.createWriteStream(FILE_PATH, {encoding: "utf-8"});
fetch(FILE_URL)
.then((response) => {
response.body.pipe(fileStream)
fileStream.on("finish", () => {
fileStream.close();
})
});
men jag får följande fel:
Property 'pipe' does not exist on type 'Response'
Jag kontrollerade också typfilen för svar i node-fetch-typerna. Den har ingen pipe-funktion.
Jag kollade typdefinitionen för node-fetch här och det verkar som att kroppen i svaret är en läsbar ström enligt gränssnittet här:
export class Body {
constructor(body?: any, opts?: { size?: number; timeout?: number });
arrayBuffer(): Promise<ArrayBuffer>;
blob(): Promise<Buffer>;
body: NodeJS.ReadableStream; // This should work.
bodyUsed: boolean;
buffer(): Promise<Buffer>;
json(): Promise<any>;
size: number;
text(): Promise<string>;
textConverted(): Promise<string>;
timeout: number;
}
och har en funktion pipeTo (jag hittade detta från dokumentationen här. Jag försökte köra följande kod efter att ha gått igenom den nämnda dokumentationen:
public async downloadXMLFeed(): Promise<void>{
// function for download the file to
// a temporary location
let fileStream = fs.createWriteStream(FILE_PATH, {encoding: "utf-8"});
fetch(FILE_URL)
.then((response) => {
response.body.pipe(fileStream)
fileStream.on("finish", () => {
fileStream.close();
})
});
Men jag får felet:
Argument of type 'WriteStream' is not assignable to parameter of type 'WritableStream<Uint8Array>'.
Typen 'WriteStream' saknar följande egenskaper från typen 'WritableStream': locked, abort, getWriter
Nu följande kod:
fs.createWriteStream(FILE_PATH, {encoding: "utf-8"});
returnerar ett objekt med typ WriteStream (kontrolleras här) som implementerar stream.Writable. Så jag förstår inte varför WriteStream-objektet inte har de nämnda funktionerna.
Också, hur löser jag detta? Finns det ett standard sätt att ladda ner http-filer i Typescript med en Node.js-backend som jag inte lyckas lista ut? Eller missar jag något här.
Svar #1
men jag får följande fel:
Property 'pipe' does not exist on type 'Response'
Detta fel utlöses också av denna kod
async function download() {
const res = await fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png');
await new Promise((resolve, reject) => {
const fileStream = fs.createWriteStream('./octocat.png');
res.body.pipe(fileStream);
res!.body!.on("error", (err) => {
reject(err);
});
fileStream.on("finish", function() {
resolve();
});
});
}
tagen härifrån. Felet utlöses eftersom fetch-funktionen tolkas som JS fetch.
För att åtgärda felet, lägg till import nodeFetch from "node-fetch"; och ersätt fetch(...) med nodeFetch(...).
