BatchRequestContent breaks on Node20+

Open
#1,998 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
45/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Quiet
Tech stack
node.js, typescript

Research direction

Start with BatchRequestContent and reproduce the relative-URL case on Node 20 using the example in the issue. Trace how request URLs are constructed, including client.api(relativeUrl)'buildFullUrl' and the reported double-host behavior. Done means the documented batch-request pattern works with relative URLs without prepending the API host twice.

Written by the indexing model from the issue text.

Description

status:waiting-for-triage type:bug
Describe the bug

While using older Node versions without undici fetch, we used the BatchRequestContent class of the Graph SDK to create batch requests. This operates on standard Request objects, but appears to use them mostly as URL containers, not actually sending those requests, because relative URLs are supported:

new BatchRequestContent([
  {id: "1", request: new Request("/users/foo@domain.com")}, 
  {id: "2", request: new Request("/users/bar@domain.com")}
]);

Since upgrading to Node 20 (way overdue, I know!), this pattern breaks, because the Request constructor does not support relative URLs:

TypeError: Failed to parse URL from users/foo@domain.com
    at new Request (node:internal/deps/undici/undici:9580:19)

How is the BatchRequestContent class intended to be used on Node 20+? Couldn't the SDK define a BatchRequestContainer class that implements Request while merely functioning as an URL container, supporting the previous pattern of relative URLs? Or perhaps a static BatchRequestStep helper?

Or should clients have to manually extract the base URL of the API and prepend it to all batch request steps? What is the preferred way of doing so?
Rather than hard-coding it, I realized I could do client.api(relativeUrl)['buildFullUrl']() but this relies on a private method.

Edit: I realized that even if i DO supply a full URL, I will instead get an error Resource not found for the segment 'v1.0, supposedly because the API host will be prepended twice.

Expected behavior

BatchRequestContent should work with relative URLs on Node 20+

How to reproduce

Create a batch request content and pass one or more relative URLs like /users/foo

SDK Version

3.0.7

Latest version known to work for scenario above?

No response

Known Workarounds

No response

Debug output
Click to expand log ```
</details>


### Configuration

_No response_

### Other information

_No response_
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.