>',typescript,session,next.js"/>

首页 > 解决方案 > “NextApiRequest”类型缺少“Request”类型的以下属性>'

问题描述

以下代码显示 Next.js 项目中的错误。

“NextApiRequest”类型的参数不可分配给“Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>”类型的参数。类型“NextApiRequest”缺少类型“Request<ParamsDictionary,any,any,ParsedQs,Record<string,any>>”中的以下属性:get、header、accepts、acceptCharsets 和 29 more.ts(2345)

import session from 'express-session'
import connectMongo from 'connect-mongo'

import type { NextApiRequest, NextApiResponse } from 'next'

const MongoStore = connectMongo(session)


export default function sessionMiddleware(req: NextApiRequest, res: NextApiResponse, next: any) {
  const mongoStore = new MongoStore({
    client: req.dbClient,
    stringify: false,
  })

  return session({
    secret: process.env.SESSION_SECRET ?? '',
    resave: false,
    saveUninitialized: false,
    store: mongoStore,
  })(req, res, next)
}

在此处输入图像描述

上述问题的任何解决方案。

标签: typescriptsessionnext.js

解决方案


块引用

我对这个问题的解决方案是使用联合类型https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html

import { RequestHandler, Request, Response } from 'express';
import { NextApiRequest, NextApiResponse } from 'next';

type NextApiRequestWithFormData = NextApiRequest &
  Request & {
    files: any[];
  };

type NextApiResponseCustom = NextApiResponse & Response;

export default function initMiddleware(middleware: RequestHandler) {
  return (
    req: NextApiRequestWithFormData,
    res: NextApiResponseCustom
  ): Promise<any> =>
    new Promise((resolve, reject) => {
      middleware(req, res, (result: any) => {
        if (result instanceof Error) {
          return reject(result);
        }
        return resolve(result);
      });
    });
}

以下代码应该适合您

import { RequestHandler, Request, Response } from 'express';
import { NextApiRequest, NextApiResponse } from 'next';

type NextApiRequestWithFormData = NextApiRequest &
  Request & {
    files: any[];
  };

type NextApiResponseCustom = NextApiResponse & Response;

推荐阅读