首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoose save() -在包装器函数中-返回文档提供折旧警告

Mongoose save() -在包装器函数中-返回文档提供折旧警告
EN

Stack Overflow用户
提问于 2020-07-25 08:50:13
回答 1查看 227关注 0票数 0

我的代码是这样的:

代码语言:javascript
复制
const mongoose = require('../common/mongoose.service').mongoose;

//..     
//.. schema definition here..
//.. 

//-- create the model
const Student = mongoose.model('Student', studentSchema);

//-- delete "__v" field
studentSchema.set('toJSON', {
    getters: true,
    transform: (doc, ret) => {    
      delete ret.__v;
      return ret;
    },
});

exports.createStudent = (studentData) => {
    const student = new Student(studentData);
    return student.save();
};

当我从我的_id控制器调用这个createStudent()方法时,它给了我这个Student

现在,我试图获得插入的文档,并将代码更新如下:

代码语言:javascript
复制
exports.createStudent = (studentData) => {
    const student = new Student(studentData);
    return student.save().then( s => { return s } ).catch( err => console.log(err) );
};

包版本:

代码语言:javascript
复制
"mongoose": "^5.9.23",
"mongoose-sequence": "^5.2.2",

我的问题:

Visual代码编辑器的

  1. 建议我将此createStudent设置为异步。需要吗?
  2. ,我为删除"_v“字段添加的代码在上面的返回中似乎不起作用。我的意思是在then() of save() method

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 10:45:20

你需要在这里进行一点重构。要么直接从方法返回允诺,要么执行它并将值解析为允诺值。

代码语言:javascript
复制
exports.createStudent = (studentData) => {
    const student = new Student(studentData);
    return student.save().then( s => { return s } ).catch( err => console.log(err) );
};

在上面的代码中,您有一个

语句,然后是/catch,结果是,当它用异步的User.save()保存用户时,您的返回会显式返回,在这种情况下,它将“未定义”。

当猫鼬返回保存方法的承诺时,您可以这样调用它

代码语言:javascript
复制
// return a promise here
exports.createStudent = (studentData) => {
  const student = new Student(studentData);
  return student.save()
};

无论您将createStudent()称为控制器/服务,只要使用thencatch或使用async/await即可。假设我们在下面的函数中调用它。

代码语言:javascript
复制
function execute() {
  createStudent({fname:'john', lname: 'doe'}).then(res => {
    console.log("student: ", student);
  }).catch(err => {
    console.log(err);
    //handle error
  })
}

或者简单地使用异步等待,使它更加简单。

代码语言:javascript
复制
async function execute() {
  try {
    let student = await createStudent({fname:'john', lname: 'doe'});
    console.log("student: ", student);

  } catch(err) {
    // handle error
  }
}

为了回答您的第二个问题,我不确定我们是否可以使用userSchema.set覆盖toJSON,但是我尝试了下面的内容,它似乎正按照我的预期工作。

这是一个User模型。请注意,toJSON在模型属性中,我在这里删除__v_id属性。

代码语言:javascript
复制
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
    name: {
        type: String,
        required: true,
        maxlength: 30,
        trim: true
    },
    role: {
        type: Number,
        default: 0
    },
    todos: [{
        type: Schema.Types.ObjectId,
        ref: "Todo"
    }]
}, {
    toJSON: {
        getters: true,
        transform: function(doc, ret) {
            delete ret._id;
            delete ret.__v
        }
    }
});
module.exports = mongoose.model("User", userSchema)

我有一个user/,它简单地从我的DB中获取所有用户,它返回我所寻找的响应类型,其中没有__v_id属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63086315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档