typescript - Skicka en variabel från next.js-mellanmjukvara till api-förfrågan


Jag försöker skicka en middleware-variabel till mina API-sidor genom "req" men det fungerar inte

Jag försökte skicka användartoken till sidor med hjälp av "req", men det returnerar alltid null

mitt middleware: pages/api/users/_middleware.ts

import { NextRequest, NextResponse } from 'next/server';
import { getAccessToken } from '@lib/auth';

declare module 'next/server' {
  interface NextRequest {
    token: string;
  }
}

export async function middleware(req: NextRequest) {
  try {
    const [, token] = await getAccessToken(req.headers.get('authorization'));
    req.token = token;
    return NextResponse.next();
  } catch(e) {
    const err = e as Error;
    const errorPayload = {
      error: 'unauthorized',
      error_message: err.message,
    };
    return new Response(
      JSON.stringify(errorPayload),
      { status: 401 },
    );
  }
}

min API-sida som jag försökte få användartoken från req: pages/api/users/[userId].ts

import { NextApiRequest, NextApiResponse } from 'next';
import { UserModel } from '@database/models';

declare module 'next' {
  interface NextApiRequest {
    token: string;
  }
}

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const user = await UserModel.findOne({ token: req.token });
  
  res.status(200).send({
    success: true,
    user,
  });

Svar #1

Du kan inte göra detta med next.js-middleware just nu. Om du använde express-middleware är det möjligt med res.locals

res.locals

Ett objekt som innehåller svarslokala variabler som är begränsade till förfrågan, och därför endast är tillgängliga för de vy(er) som renderas under den förfrågan/svar-cykeln (om några). Annars är denna egenskap identisk med app.locals.

Denna egenskap är användbar för att exponera information på begärandenivå, såsom begärans sökvägsnamn, autentiserad användare, användarinställningar och så vidare.

app.use((req, res, next) => {
  res.locals.path = req.path;
  next();
});

next.js-middleware har ingen res, att lägga till lokala variabler direkt på request-objektet stöds inte. Detta är fel:

export default async function handler(req: NextApiRequest, res: NextApiResponse) {}

next.js-middleware tar req och ev

export default async function handler(req,ev) {

     console.log({req,ev})
}