使用 Express/MongoDB 构建收件箱系统

Posted

技术标签:

【中文标题】使用 Express/MongoDB 构建收件箱系统【英文标题】:Building an inbox system using Express/MongoDB 【发布时间】:2017-09-21 09:27:10 【问题描述】:

我一直在为我的个人项目开发一个出租公寓的应用程序。我一直想知道如何为当前使用 mongodb 作为数据库的应用程序构建/实现收件箱系统。

这样的功能有什么重要的?是否可以定义一个名为 messages 的模式?

var MessageSchema = new mongoose.Schema(
  message: String,
  sender : 
        id : 
            type : mongoose.Schema.Types.ObjectId,
            ref: "User"
          ,
         username: String
    
  recipient : 
        id : 
            type : mongoose.Schema.Types.ObjectId,
            ref: "User"
          ,
         username: String
    
);

如果我要向用户 y 发送消息,那么它将被存储为收件人,而 x 值将是发件人。当我想呈现一个名为收件箱的页面时,我可以使用 Messages.find(req.user._id) 对所有消息进行排序吗?我对架构设计有点迷茫。

【问题讨论】:

【参考方案1】:

对于架构,您可能想要这样的东西:

const messageSchema = new mongoose.Schema(
  subject: String,
  body: String,
  seen: Boolean,
  sender: 
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  
  recipient: 
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  
)

const userSchema = new mongoose.Schema(
  username: String,
  email: Boolean,
  type: String
)

var Message = mongoose.model('Message', messageSchema);
var User = mongoose.model('User', userSchema);

对于查询,你可以找到你需要的一切here

【讨论】:

@Ozan,这能回答你的问题吗? 在某种程度上确实如此。我担心使用这样的模式是否真的安全。 为什么不安全?请记住,您无需公开架构中的任何内容。 假设用户 x 正在查看消息并且路由是 app.get('messages/:messageId') 在将消息呈现到前面之前,我是否必须使用中间件来检查消息的所有权?否则任何有消息 ID 的人都可以阅读任何消息吗? 是的,可以使用中间件,但是,我会在处理程序的第一行中检查 'messages/:messageId'。我们使用 Passport 进行用户管理,它将用户对象放到请求中。 passportjs.org

以上是关于使用 Express/MongoDB 构建收件箱系统的主要内容,如果未能解决你的问题,请参考以下文章

重点突破—— Nodejs+Express+MongoDB的使用基础

Node、Express、MongoDB:使用对象数组创建模式?

Node.JS、Express 和 MongoDB :: 多个集合

学习笔记:Vue+Node+Mongodb构建简单商城系统

使用 Express、Mongodb 和 EJ 显示下拉动态数据

使用node+express+mongodb实现用户注册登录和验证功能