【问题标题】:Cache MongoDb connection with Next.js 10 TypeScript Project - API Route使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由
【发布时间】: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。如果是的话,请你分享一下

标签: mongodb typescript next.js


【解决方案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;
          }
        }
      }
      

      【讨论】:

      • 有人找到更好的解决方案了吗?如果是,请发布作为答案。
      猜你喜欢
      • 2021-05-02
      • 2020-08-12
      • 2020-06-01
      • 2021-04-02
      • 1970-01-01
      • 2020-10-11
      • 2020-06-06
      • 2021-06-21
      • 2021-08-08
      相关资源
      最近更新 更多