为什么在分配属性后保存不是函数?

时间:2017-03-10 10:36:27

标签: javascript node.js mongoose

TypeError:newUser.save不是一个函数(在createNew函数中)

在使用spread运算符赋值属性之前,userModel对象具有一个save函数(由mongoose设计),但是在赋值之后,该函数不再被访问。有人可以解释为什么会这样,以及如何绕过它?

const mongoose = require('mongoose')

const UserSchema = new mongoose.Schema({
  facebookid: String,
  firstname: String,
  lastname: String,
  email: String,
  timezone: Number,
  gender: String,
  invitationid: String,
  referralid: String,
  locale: String,
  stage: String
})

const User = mongoose.model('User', UserSchema)

const createUser = () => new User()

module.exports = {
  createNew : userInfo => {

    const userModel = createUser()

    const newUser =  { ...userModel,
      facebookid: userInfo.fid,
      firstname: userInfo.first_name,
      lastname: userInfo.last_name,
      locale: userInfo.locale,
      timezone: userInfo.timezone,
      gender: userInfo.gender,
      invitationid: userInfo.invitationid,
      referralid: userInfo.referralid,
      stage: 'NA'
    }
    return newUser.save()
  }
}

感谢您的帮助! 伴侣

3 个答案:

答案 0 :(得分:1)

实际上,您的newUser不是User对象。

...userModel只会合并对象“拥有”属性,而不是原型。

尝试这样的事情:

const newUser = new User({/* your user */});
newUser.save();

答案 1 :(得分:1)

您可以在创建新用户时传递对象: -

module.exports = {
createNew : userInfo => {

const userModel = createUser({
  facebookid: userInfo.fid,
  firstname: userInfo.first_name,
  lastname: userInfo.last_name,
  locale: userInfo.locale,
  timezone: userInfo.timezone,
  gender: userInfo.gender,
  invitationid: userInfo.invitationid,
  referralid: userInfo.referralid,
  stage: 'NA'
})

return userModel.save()
}
}

并修改

createUser = (user) => new User(user)

现在userModel包含mongoose orm返回的用户,你可以访问save function.Earlier你没有使用mongoose返回的用户对象,你创建了新的

答案 2 :(得分:0)

正如关于问题而非可能的解决方案的细节一样

使用{...userModel}您将User实例的直接属性复制到普通对象。从扩展类继承的任何属性或方法都将被忽略,最重要的是,原型链本身将丢失。

save()方法可能是在moongoose的Schema类中定义的,所以你会用这种方法失去它。

其他答案中提出的任何解决方案都可以解决问题。