在 Next.js 14 中间件中使用 Mongoose 时,MyModel.findOne 不是一个函数

问题描述 投票:0回答:1

我的 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。

node.js typescript mongodb mongoose next.js
1个回答
0
投票

这是因为 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

net
API,这是 MongoDB 节点驱动程序用来连接 MongoDB 的。

您需要一个 API 端点,连接到您的数据库,您的中间件将调用它。

© www.soinside.com 2019 - 2024. All rights reserved.