我的 Next.js 中间件中有以下调用:
let user: UserType[] | null = null;
try {
user = await findUser({id});
console.log("user", user);
} catch (error: any) {
throw new Error(error)
}
但是,我收到错误:
⨯ unhandledRejection: Error: TypeError: ___WEBPACK_IMPORTED_MODULE_0__.User.find is not a function
at addSiteToIntegration (webpack-internal:///(middleware)/./middleware.ts:51:15)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
这是我的猫鼬架构:
import mongoose from "mongoose";
const UserSchema = new mongoose.Schema({
userId: String,
name: {
type: String,
required: true,
},
email: String,
phone: String,
city: {
type: String,
default: "",
},
apiKeys: [
{
purpose: String,
key: String,
allowedOrigins: Array,
},
],
customerRating: {
type: Number,
required: true,
default: 0,
},
businessName: String,
businessRating: Number,
bio: String,
businessBio: String,
businessDisplayName: String,
isBetaUser: {
type: Boolean,
default: false,
},
reviewWizardPresets: [
{
id: String,
text: String,
onStars: String,
},
],
blockList: [
{
type: String,
},
],
accesingWebsites: [{ url: String, description: String, name: String }],
createdAt: {
type: Date,
required: true,
default: () => Date.now(),
},
updatedAt: Date,
});
export default mongoose.models?.User || mongoose.model("User", UserSchema);
此问题仅出现在 Next.js 中间件中,而不出现在常规服务器组件或路由处理程序中。知道为什么吗?
我在我的 Atlas 集群中使用 Next.js 14.1、Mongoose 8.2.0 和 MongoDB 6.0.13。
这是因为 Next.js 中的
middleware
是一个 Edge Function,存在局限性,因为 Next.js 中的 Edge Runtime 基于 Web API。所以大多数时候连接数据库是行不通的。
说到
mongoose
,你绝对不能,正如他们在文档中所说:
Mongoose 目前不支持 Next.js Edge Runtime。虽然您可以在 Edge Runtime 中导入 Mongoose,但您将获得 Mongoose 的浏览器库。 Mongoose 无法在 Edge Runtime 中连接到 MongoDB,因为 Edge Runtime 目前不支持 Node.js
API,这是 MongoDB 节点驱动程序用来连接 MongoDB 的。net
您需要一个 API 端点,连接到您的数据库,您的中间件将调用它。