使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由

Posted

技术标签:

【中文标题】使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由【英文标题】:Cache MongoDb connection with Next.js 10 TypeScript Project - API Route 【发布时间】:2021-04-23 01:01:14 【问题描述】:

我正在尝试将 next.js/examples/with-mongodb/util/mongodb.js 转换为 TS,以便我可以在 TS next.js 项目中缓存并恢复与 Mongo 的连接。我在cache.promise 上收到一个 TS 错误,上面写着: Type 'Promise<MongoClient | client: MongoClient; db: Db; >' is not assignable to type 'Promise<MongoClient>'

我应该如何在 global 上正确声明 mongo 属性以安抚 TS 大神?

import  MongoClient, Db  from "mongodb";

const  DATABASE_URL, DATABASE_NAME  = process.env;

declare global 
  namespace NodeJS 
    interface Global 
      mongo: 
        conn: MongoClient | null;
        promise: Promise<MongoClient> | null;
      ;
    
  


let cached = global.mongo;

if (!cached) 
  cached = global.mongo =  conn: null, promise: null ;


async function connect() 
  if (cached.conn) 
    return cached.conn;
  

  if (!cached.promise) 
    const opts = 
      useNewUrlParser: true,
      useUnifiedTopology: true,
    ;

    cached.promise = MongoClient.connect(DATABASE_URL, opts).then((client) => 
      return 
        client,
        db: client.db(DATABASE_NAME),
      ;
    );
  
  cached.conn = await cached.promise;
  return cached.conn;


export  connect ;

【问题讨论】:

nextjs with-mongodb 已更改。你没有把新版本转换成 TypeScript。如果是的话,请你分享一下 【参考方案1】:

你不需要缓存你的连接,用 mongodb example 检查最新的 nextjs。 mongodb官方论坛experts have navigated我这个示例项目。

尝试使用原生解决方案

【讨论】:

【参考方案2】:

您存储的“conn”属性包含MongoClient Db

mongo 的全局声明中,您只包含了MongoClient。我的项目中有完全相同的代码,我处理它的方式是简单地创建一个名为MongoConnection 的基本类型,它包含两者。代码如下。

type MongoConnection = 
  client: MongoClient;
  db: Db;
;

declare global 
  namespace NodeJS 
    interface Global 
      mongo: 
        conn: MongoConnection | null;
        promise: Promise<MongoConnection> | null;
      
    
  

【讨论】:

【参考方案3】:

似乎答案是将 mongo 属性设置为 any,如下所示:

declare global 
  namespace NodeJS 
    interface Global 
      mongo: any;
    
  

【讨论】:

有人找到更好的解决方案了吗?如果是,请发布作为答案。

以上是关于使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 和 Next.js 中使用绝对导入解析模块

在带有 TypeScript 的 Next.js 中使用 getInitialProps

使用 getStaticProps 获取数据 Next.js 和 Typescript

如何在带有 TypeScript 的 next.config.js 中使用 i18n 和 next/image?

使用`let cached = global.mongoose`时出现Next.js + Typescript + mongoose错误

如何使用 Next.js、Ant Design、Less 和 TypeScript 配置 Storybook.js Webpack