我在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.
它无法再与我的应用程序上的任何其他操作连接。即使是与身份验证无关的连接。我错过了什么吗?
我试过在新旧实现之间切换,结果发现这是新实现的问题,但我不明白是什么原因造成的。
1条答案
按热度按时间vyswwuz21#
虽然有点晚了,但是我已经成功地解决了一个类似的问题,在db方法前面加上一个await关键字,也许这对另一个问题也有帮助。
所以,请更换
与