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

NodeJS调用MongoDB接口查询聊天消息返回null是什么原因?

问题根因

这是Express 路由匹配顺序规则导致的问题:
Express 路由会按照代码定义的先后顺序进行匹配,一旦匹配到符合规则的路由就会直接进入该逻辑,不会继续向后匹配。
你当前代码中路由定义顺序如下:

  1. 先定义了动态参数路由 GET /:firstUserId/:secondUserId
  2. 再定义了动态参数路由 GET /:userId
  3. 最后才定义了 /message 开头的静态路由

当你发起请求时:

  • 请求 GET /message/findAll 会被优先匹配到 GET /:firstUserId/:secondUserId 路由,系统会把 message 当成firstUserId、findAll当成secondUserId去Chat集合查询数据,查询不到自然返回null
  • 请求 GET /message/{MessageId} 会被优先匹配到 GET /:userId 路由,系统会把 message 当成userId去Chat集合查询数据,查询不到就返回null

这也完全符合你描述的“删除这两个异常接口代码,接口依然返回null,只有删除整个文件才会报错”的现象:就算删了/message的两个接口,请求还是会被前面的动态参数路由捕获,直到整个文件的路由都被移除才会报404。

解决方案

调整路由定义顺序,所有静态路径的路由要放在动态参数路由的前面,调整后的顺序参考:

const router = require("express").Router();
const Post = require("../models/Post");
const User = require("../models/User");
const Chat = require("../models/Chat");
const Message = require("../models/ChatMessage");

// 先放所有/message开头的静态路由
// *Get Chat Message*
router.get("/message/:MessageId",async(req, res)=>{
try{
    const message = await Message.findById(req.params.MessageId);
    res.status(200).json(message)
    } catch (err){
        res.status(500).json(err)
    }
})
// *Get All Chat Message*
router.get("/message/findAll",async(req, res)=>{
try {
    const messages = await Message.find();
    res.status(200).json(messages)
} catch (err) {
    res.status(500).json(err);
}
})
// *Put Chat Message*
router.put("/message",async(req, res)=>{
const newMessage = new Message(req.body)
try {
    const savedMessage = await newMessage.save();
    res.status(200).json(savedMessage)
} catch (err) {
    res.status(500).json(err)
}
})

// 再放其他静态路由
// *Create Chat*
router.post("/",async(req, res)=>{
const chat = new Chat(req.body)
try {
    const savedChat = await chat.save();
    res.status(200).json(savedChat);
}catch(err){
    res.status(500).json(err)
}
})
// *Delete Chat*
router.delete("/:firstUserId/:secondUserId",async(req, res)=>{
const chat = await Chat.findOne({ users: { $all: [req.params.firstUserId, req.params.secondUserId] } });
try{
    chat.deleteOne();
    res.status(200).json("The chat has been delete successfully.")
    } catch (err){
        res.status(500).json(err)
    }
})
// * Get a Chat *
router.get("/:firstUserId/:secondUserId", async(req, res) => {
    const chat = await Chat.findOne({ users: { $all: [req.params.firstUserId, req.params.secondUserId] } });
    res.status(200).json(chat);
})
// * Get every Chat of one user * 动态参数路由放最后
router.get("/:userId", async(req, res) => {
try{
    const chats = await Chat.find({ users: { $all: [req.params.userId]} });
    res.status(200).json(chats);
}catch(err){
    res.status(500).json(err);
}
})

另外注意检查代码的闭合符号,你贴出的get /message/findAll代码缺少闭合的},调整顺序时顺便补全即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:04