【问题标题】:Is Good practice to use operations as method in mongoose Schema在猫鼬模式中使用操作作为方法的好习惯
【发布时间】:2019-06-08 03:27:05
【问题描述】:

我已经使用猫鼬有一段时间了。我想知道我这样做是对是错,最佳做法是什么。

我正在做的是::

/* myModel.js */

const mongoose = require('mongoose'),
      Schema = mongoose.Schema;

// 1. 创建我的架构

const mySchema = new Schema({
  name: String,
  age: Number
});

// 2.想使用fetch操作 // 但是我已经为此创建了方法

mySchema.methods.fetchById = async function(){
  return await myModel.findById(this._id);
}

// 3. 创建模型

module.exports = myModel = mongoose.model('myModel', mySchema);

/* myController.js */

const User = require('./myModel');

router.get('user/:id', async (req, res, next) => {
  try {
    let user = new User({
      _id: req.params.id
    })
    res.status(200).json(await user.fetchById());
  } catch (err) {
    next(err);
  }
})

【问题讨论】:

    标签: node.js mongodb express mongoose nosql


    【解决方案1】:

    为了获取实例对象而创建实例方法不是一个好习惯,因为:

    1. 令人困惑,容易出错
    2. 它违反了 Mongoose API 设计(参见 1)
    3. 你必须创建一个新对象,它需要更多的内存分配
    4. 在这种情况下它需要更多的代码行,你需要学习一个新的 API,你可能会引入错误并且它不会增加任何改进

    您应该在控制器中简单地使用静态方法findById

    const User = require('./myModel');
    
    router.get('user/:id', async (req, res, next) => {
      try {
        res.status(200).json(await User.findById(req.params.id));
      } catch (err) {
        next(err);
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2023-03-29
      • 2021-04-16
      • 2018-10-28
      • 2022-01-08
      相关资源
      最近更新 更多