Lachlan Kemp
Lachlan Kemp

Reputation: 55

How to solve "API resolved without sending a response fetch" when using sentry

I've looked at countless other posts and cannot find the answer to this, why am I continuously getting the API resolved without sending a response for /api/git/latest-commit, this may result in stalled requests. error in next.js? As soon as I disable sentry it goes away, has anyone else struggled with this?

import type { NextApiRequest, NextApiResponse } from 'next'
import { withSentry } from "@sentry/nextjs";

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
    const response = await fetch(`https://api.github.com/repos/####/####/commits?per_page=1`, {
        method: 'GET'
    });

    const data = await response.json();
    const commit = data[0]
    res.status(200).json({
        sha: {
            full: commit.sha,
            short: commit.sha.substring(0,7)
        },
        committer: commit.commit.committer.name,
        time: commit.commit.committer.date,
        html_url: commit.html_url
    })
};

export default withSentry(handler);

Upvotes: 1

Views: 2694

Answers (1)

Mark G
Mark G

Reputation: 2206

Running your code produced the following message on my end (next 12.1.4, @sentry/nextjs 6.19.7):

[sentry] If Next.js logs a warning "API resolved without sending a response", it's a false positive, which we're working to rectify.
In the meantime, to suppress this warning, set SENTRY_IGNORE_API_RESOLUTION_ERROR to 1 in your env.
To suppress the nextjs warning, use the externalResolver API route option (see https://nextjs.org/docs/api-routes/api-middlewares#custom-config for details).

To suppress the warning from Sentry, I added this environment variable to an .env.development file:

SENTRY_IGNORE_API_RESOLUTION_ERROR=1

To suppress the warning from the Next.js API route, I added this to latest-commit.ts:

// ...

export const config = {
  api: {
    externalResolver: true,
  },
};

export default withSentry(handler);

Both warnings no longer appear and the data appears to return correctly.

After some digging, this was their explanation as to what's happening: https://github.com/getsentry/sentry-javascript/pull/4139

In dev, nextjs checks that API route handlers return a response to the client before they resolve, and it throws a warning if this hasn't happened. Meanwhile, in withSentry(), we wrap the res.end() method to ensure that events are flushed before the request/response lifecycle finishes.

As a result, there are cases where the handler resolves before the response is finished, while flushing is still in progress.

Upvotes: 5

Related Questions