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(...).

Relaterade artiklar