NodeJS调用MongoDB接口查询聊天消息返回null是什么原因?
问题根因
这是Express 路由匹配顺序规则导致的问题:
Express 路由会按照代码定义的先后顺序进行匹配,一旦匹配到符合规则的路由就会直接进入该逻辑,不会继续向后匹配。
你当前代码中路由定义顺序如下:
- 先定义了动态参数路由
GET /:firstUserId/:secondUserId - 再定义了动态参数路由
GET /:userId - 最后才定义了
/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
相关产品推荐
相关产品推荐

