TypeError when Downloading to PDF in Azure App Service: undici failure

Open
#1,990 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
25/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
azure, node.js, typescript
Domain
api, backend, cloud

Research direction

Start with conversionDownloadToPdf and the @microsoft/microsoft-graph-client request using ResponseType.RAW, then compare the local and Azure App Service environments on Node v18.19.1. Inspect the full undici error cause and determine whether ProxyAgent or an officially documented workaround addresses the failure; done means the PDF download works in Azure or the limitation is clearly documented.

Written by the indexing model from the issue text.

Description

Download to PDF Not Working in Azure App Service

I'm running an express app using Node v18.19.1. My endpoint does the following:

  1. Saves a document to a sharepoint folder
  2. Performs the download/convert to pdf
  3. Saves the downloaded pdf to a Mongo db.
  4. Deletes the original file

Steps 1, 2, and 4 use the @microsoft/microsoft-graph-client@3.0.7 package. This all works locally. However, when I deploy it to my Azure App Services (running Windows and Node v18.19.1), it breaks at step 2 with the following error:

TypeError: fetch failed at node:internal/deps/undici/undici:12625:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

The conversion download method:

const conversionDownloadToPdf = async (fileItemId) => {
    try {
        console.log(chalk.blue(`Attempting to downloaded file (${fileItemId})...`));

        const response = await client.api(`drives/${process.env.DRIVE_ID}/items/${fileItemId}/content?format=pdf`)
            .responseType(ResponseType.RAW) // ensure raw stream
            .get();

        const stream = await apiRequest.responseType(ResponseType.RAW).get(); // BREAKS HERE

        console.log(chalk.blue(`Stream downloaded. Streaming to buffer...`));
      
        return await toBuffer(stream);
    } catch (error) {
        console.error(chalk.red(`Full error details:`));
        console.error(chalk.red(`Message: ${error.message}`));
        console.error(chalk.red(`Status Code: ${error.statusCode}`));
        console.error(chalk.red(`Code: ${error.code}`));
        console.error(chalk.red(`Stack: ${error.stack}`));
        
        // Log the cause if available (undici errors have this)
        if (error.cause)
            console.error(chalk.red(`Cause: ${JSON.stringify(error.cause, null, 2)}`));

        throw error;
    }
}

Do I need to use that ProxyAgent? Do you have official docs on a workaround?

Dominant language
TypeScript
Stars
833
Forks
240
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from microsoftgraph/msgraph-sdk-javascript

All issues in microsoftgraph/msgraph-sdk-javascript

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.