【问题标题】:Typescript Mongodb native driver connection with the ability to reuse connection具有重用连接能力的 Typescript Mongodb 原生驱动连接
【发布时间】:2021-07-24 22:23:19
【问题描述】:

使用重用现有连接的打字稿连接到 MongoDB 的最佳方式是什么。我最近将我的 JavaScript 代码库迁移到 typescript 并且 typescript 中的 MongoDB 连接引发错误

我需要如何使用 typescript 连接 MongoDB 驱动程序,以便我可以重用现有的数据库连接或帮助我解决连接问题

这是(node:3732) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'conn' of undefined下面代码中的错误

import { MongoClient, Db } from "mongodb";

const { DATABASE_URL, DATABASE_NAME } = process.env;

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

declare global {
  namespace NodeJS {
    interface Global {
      mongodb: {
        conn: MongoConnection | null;
        promise: Promise<MongoConnection> | null;
      };
    }
  }
}
let cached = global.mongodb;
async function connectToDatabase() {
  if (cached.conn) {
    return cached.conn;
  }

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

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

export { connectToDatabase };

【问题讨论】:

    标签: node.js typescript mongodb


    【解决方案1】:

    试试这个

    在您的声明let cached = global.mongodb; 之后添加这些行

    if (!cached) {
      cached = global.mongodb = { conn: null, promise: null };
    }
    

    所以它应该是这样的

    import { MongoClient, Db } from "mongodb";
    
    const { DATABASE_URL, DATABASE_NAME } = process.env;
    
    type MongoConnection = {
      client: MongoClient;
      db: Db;
    };
    
    declare global {
      namespace NodeJS {
        interface Global {
          mongodb: {
            conn: MongoConnection | null;
            promise: Promise<MongoConnection> | null;
          };
        }
      }
    }
    let cached = global.mongodb;
    if (!cached) {
      cached = global.mongodb = { conn: null, promise: null };
    }
    
    async function connectToDatabase() {
      if (cached.conn) {
        return cached.conn;
      }
    
      if (!cached.promise) {
        const opts = {
          useNewUrlParser: true,
          useUnifiedTopology: true,
        };
    
        cached.promise = MongoClient.connect(DATABASE_URL as string, opts).then(
          (client) => {
            return {
              client,
              db: client.db(DATABASE_NAME),
            };
          }
        );
      }
      cached.conn = await cached.promise;
      return cached.conn;
    }
    
    export { connectToDatabase };
    

    出于推理,您已扩展 Global 接口以包含 conn 和对 mongodb 的承诺,但您忘记使用该对象初始化缓存变量。

    将缓存设置为{ conn: null, promise: null } 后,您已将它们的初始值设置为空。

    在将它们设置为 null 之前进行方便的 if 检查是确保您不会一直将它们设置为 null,我猜这是托管在您希望重用连接的无服务器环境中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多