[▲ Vercel Community](/) · [Categories](/categories) · [Latest](/latest) · [Top](/top) · [Live](/live)

[Help](/c/help/9)

# Uncaught Exception: ERR_STREAM_WRITE_AFTER_END in Next.js API route

86 views · 0 likes · 3 posts


Gourav Goyal (@gorvgoyl) · 2024-07-19

I'm frequently encountering this error in one of my Next.js serverless API routes:

"Uncaught Exception: Error [ERR_STREAM_WRITE_AFTER_END]"

This error suggests that there's an attempt to write to a response object after it has already been closed. However, based on my code, this shouldn't be happening. 

Here's the API code:

```js
import type { NextApiRequest, NextApiResponse } from 'next';
import { CURRENT_ORIGIN } from '../../../common/envVar';
import { trackEventMxp } from '../../../modules/analytics/serverAnalytics';
import { sendEmailNodeRuntime } from '../../../modules/email/send';
import { checkAuth, extractToken } from '../../../modules/firebase/auth';
import { getUserFromId } from '../../../modules/firebase/firebaseHelper';
import { getCustomTokenFromUid } from '../../../modules/firebase/localEncryption';
import { sendSlackMessageToChannel } from '../../../modules/slack/slack';
import { apiError, type ApiSchemaRequest, type ApiSchemaResponse } from '../../../shared/apiSchema';

type Response = ApiSchemaResponse['/api/auth/sendEmailVerificationMail'];
type Body = ApiSchemaRequest['/api/auth/sendEmailVerificationMail']['fetchOptions']['body'];

export default async function sendEmailVerificationMail(req: NextApiRequest, res: NextApiResponse<Response>) {
    try {
        const userFromToken = await checkAuth(req, 'node-runtime', false);

        if (!userFromToken) {
            const token = extractToken(req, 'node-runtime') || '';
            throw new Error(`uid not found`);
        }

        // get latest user info in case it has changed
        const user = (await getUserFromId(userFromToken.uid))!;

        const body: Body = req.body;
        const { source } = body;

        const { uid, email, displayName } = user;

        if (user.emailVerified) {
            res.status(200).json({ data: null, error: null });
            return;
        }

        const token = getCustomTokenFromUid(uid);

        const verifyLink = `${CURRENT_ORIGIN}/verify-email?token=${token}&source=${source}`;

        const resp = await sendEmailNodeRuntime({
            template: 'verify your email',
            email: email!,
            mailMergeParams: { name: displayName, verifyLink: verifyLink },
        });

        await trackEventMxp(user.uid, 'email_verification_link_sent', {
            email: user.email,
        });

        console.log('sendEmailVerificationMail done ');
        res.status(200).json({ data: null, error: null });
    } catch (e: any) {
        console.error('[sendEmailVerificationMail] catch error:', e);

        // send verification failure to alerts
        await sendSlackMessageToChannel('alerts', `[sendEmailVerificationMail] catch error:  ${e.message}`);

        res.status(400).json({ data: null, error: apiError.unknown_error });
    }
}


```

full error log

```bash
ncaught Exception: Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at new NodeError (node:internal/errors:405:5)
    at ServerResponse.end (node:_http_outgoing:1017:15)
    at K.t.end (/var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:13847)
    at /var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:14667
    at K.t.send (/var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:14676)
    at K.t.json (/var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:14759)
    at p (/var/task/.next/server/pages/api/auth/verifyEmail.js:1:3060)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async K (/var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:16853)
    at async U.render (/var/task/node_modules/.pnpm/next@14.2.4_react-dom@18.3.1_react@18.3.1__react@18.3.1_sass@1.77.6/node_modules/next/dist/compiled/next-server/pages-api.runtime.prod.js:20:17492) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}
Node.js process exited with exit status: 129. The logs above can help with debugging the issue.
```


Amy Egan (@amyegan) · 2024-07-22

Hey @gorvgoyl. Are you still experiencing this problem?


Gourav Goyal (@gorvgoyl) · 2024-07-23

No such error logs in the last 24 hrs.