我的MongoDB数据库连接在关闭时没有重新打开

q8l4jmvw  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(151)

我在Next.js应用程序中使用NextAuth实现了一个身份验证系统。我使用NextAuth凭据作为自定义登录屏幕的提供者。
我使用的是NextAuth v.4。
以前我已经建立了我的连接,如下所示:

import { MongoClient } from 'mongodb';

export async function connectToDatabase() {
    const client = await MongoClient.connect(process.env.DATABASE_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    });

    return client;
}

然后我在[...nextauth].js文件的authorize函数中调用它。

import NextAuth from "next-auth";
import CredentialsProvider from 'next-auth/providers/credentials';
import { connectToDatabase } from "../../../lib/database";
import { verifyPassword } from "../../../lib/auth";

export default NextAuth({
    providers: [
        CredentialsProvider({
            authorize: async (credentials) => {

                const client = await connectToDatabase();
                const db = client.db();

                const user = await db.collection('users').findOne({ email: credentials.email });

                if (!user) {
                    client.close();
                    throw new Error("User not found.");
                }

                const isValid = await verifyPassword(credentials.password, user.password);

                if (!isValid) {
                    client.close();
                    throw new Error("Invalid username or password.");
                }

                client.close();

                return { email: user.email, username: user.username, name: user.name };
            }
        }),
    ],
    secret: process.env.NEXTAUTH_SECRET,
    jwt: {
        secret: "SOME_SECRET",
    }
});

现在上面的操作和预期的一样,但是,数据库请求的速度非常慢。另外,我看了MongoDB官方指南中关于创建数据库连接的内容,这是他们建议我使用的:

import { MongoClient } from 'mongodb';

const uri = process.env.DATABASE_URI;
const options = {
  useUnifiedTopology: true,
  useNewUrlParser: true,
}

let client;
let clientPromise;

if (!process.env.DATABASE_URI) {
  throw new Error('Please add your Mongo URI to .env.local');
}

if (process.env.NODE_ENV === 'development') {
  if (!global._mongoClientPromise) {
    client = new MongoClient(uri, options);
    global._mongoClientPromise = client.connect();
  }
  clientPromise = global._mongoClientPromise;
} else {
  client = new MongoClient(uri, options);
  clientPromise = client.connect();
}

export default clientPromise;

从这里开始,我继续导入客户端并以不同的方式建立连接:

import clientPromise from "../../../lib/database";

下面是我如何初始化连接:

const client = await clientPromise;
const db = client.db();

这大大提高了我的MongoDB速度10倍,从每次取数请求400ms左右,降低到40ms左右或更少,非常棒。
现在来谈谈实际问题。
每次我关闭与client.close()的连接,而使用clientPromise实现时,它永远不会在任何其他打开的连接上重新连接。
我得到的错误是:

MongoNotConnectedError: MongoClient must be connected to perform this operation.

它无法再与我的应用程序上的任何其他操作连接。即使是与身份验证无关的连接。我错过了什么吗?
我试过在新旧实现之间切换,结果发现这是新实现的问题,但我不明白是什么原因造成的。

vyswwuz2

vyswwuz21#

虽然有点晚了,但是我已经成功地解决了一个类似的问题,在db方法前面加上一个await关键字,也许这对另一个问题也有帮助。
所以,请更换

const db = client.db();

const db = await client.db();

相关问题