You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB+NextJS开发聊天系统遇TypeError: chat.insertOne is not a function错误

聊天系统开发报错排查:TypeError: chat.insertOne is not a function

我基于MongoDB和NextJS开发支持用户互发消息的聊天系统时出现报错,相关代码和错误信息如下:

POST接口代码

import { connectDB } from '@/app/lib/database';
import Chat from '@/app/models/chat';
import { NextResponse } from 'next/server';

export async function POST(req) {
    const { postOwner, userId, username, message, senderId } = await req.json();
    await connectDB();

    const chat = await Chat.findOne({ members: { $all: [postOwner, userId] } });

    if (!chat) {
        chat.create(
            { members: [userId, postOwner] },
            { chat: [{ username, message, senderId }] }
        );
        console.log(chat);
        return NextResponse.json(
            { message: 'Chat Created', chat },
            { status: 200 }
        );
    } else {
        console.log(chat);
        chat.insertOne({ chat: [{ username, message, senderId }] });

        return NextResponse.json(
            { message: 'Chat added', chat },
            { status: 200 }
        );
    }
}

Chat模型代码

import mongoose, { Schema, models } from 'mongoose';

const chatSchema = new Schema(
    {
        members: {
            userId: String,
            postOwner: String,
        },
        chat: {
            username: String,
            message: String,
            senderId: String,
        },
    },
    { timestamps: true }
);

const Chat = models.Chat || mongoose.model('Chat', chatSchema);
export default Chat;

错误信息

TypeError: chat.insertOne is not a function
at POST (webpack-internal:///(rsc)/./app/api/chat/route.js:46:14)

错误原因

  1. 方法调用错误:chat是Mongoose查询返回的文档实例,insertOne是MongoDB集合的方法,不能直接在文档实例上调用。
  2. 模型结构设计不合理:当前members定义为单个对象,无法存储双方用户ID;chat定义为单个对象,无法存储多条聊天消息,不符合聊天系统的存储需求。
  3. 创建新聊天的逻辑错误:if (!chat)分支中,chat为null时调用chat.create会直接报错,应该使用模型的静态方法Chat.create。

解决方法

1. 修改Chat模型结构

调整字段类型为数组,适配多成员和多消息的存储场景:

import mongoose, { Schema, models } from 'mongoose';

const chatSchema = new Schema(
    {
        members: [String], // 存储双方用户ID的数组
        chat: [
            {
                username: String,
                message: String,
                senderId: String,
            }
        ], // 存储多条聊天消息的数组
    },
    { timestamps: true }
);

const Chat = models.Chat || mongoose.model('Chat', chatSchema);
export default Chat;

2. 修正POST接口逻辑

替换错误的方法调用,使用Mongoose文档的正确操作方式:

import { connectDB } from '@/app/lib/database';
import Chat from '@/app/models/chat';
import { NextResponse } from 'next/server';

export async function POST(req) {
    const { postOwner, userId, username, message, senderId } = await req.json();
    await connectDB();

    // 查询双方用户的聊天记录,确保匹配包含两个用户ID的数组
    const chat = await Chat.findOne({ 
        members: { $all: [postOwner, userId] }
    });

    if (!chat) {
        // 使用模型静态方法创建新聊天
        const newChat = await Chat.create({
            members: [userId, postOwner],
            chat: [{ username, message, senderId }]
        });
        return NextResponse.json(
            { message: 'Chat Created', chat: newChat },
            { status: 200 }
        );
    } else {
        // 向chat数组添加新消息并保存
        chat.chat.push({ username, message, senderId });
        await chat.save();
        return NextResponse.json(
            { message: 'Chat added', chat },
            { status: 200 }
        );
    }
}

关键修改点

  • 模型字段改为数组,支持存储双方用户和多条消息。
  • 创建新聊天时使用Chat.create而非chat.create。
  • 添加消息时用push操作数组,调用save()保存修改,替代错误的insertOne。
  • 优化查询条件,确保能正确匹配双方用户的聊天记录。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:57:25