为什么在mongoose中保存()不是一个函数?

时间:2017-12-11 11:40:56

标签: node.js mongodb

我正在使用Node.js,Mongoose,MongoDb,express开发应用程序。

我有两个模式,一个用于学生,另一个用于片段。我正在使用人口模型人口模型。我可以创建一个用户,并创建一个片段并将其链接到用户。但我无法链接并保存用户集合中的代码段。

如何链接和保存用户,以便它可以引用他的代码段?

用户和代码段架构

var userSchema = Schema({
       name: { type: String, required: true, unique: true },
     password: { type: String, required: true },
    snippet: [{ type: Schema.Types.ObjectId, ref: 'Snippet' }]
    })

   var snippetSchema = Schema({
   user: {type: Schema.Types.ObjectId, ref: 'User'},
    title: String,
   body: String,
    createdAt: {
    type: Date,
   require: true,
    default: Date.now
     }
    })

这就是我保存片段的方法,我将它添加到用户.save()函数中,以便它保存片段ref,但它给了我user.save()不是函数错误。

   var name = request.session.name.name
   User.find({ name: name }).then(function (user) {
    if (user) {
      console.log('====================')
      console.log(user)
      user.save().then(function () {    // problem is here? 
        var newSnippet = new Snippet({
          user: user._id,
          title: title,
          body: snippet
        })

        newSnippet.save().then(function () {
          // Successful
          console.log('success')

          response.redirect('/')
        })
      })
    }
  }).catch(function (error) {
    console.log(error.message)
    response.redirect('/')
  })

但是,我实际上在搜索后打印了对象!

[ { _id: 5a2e60cf290a976333b19114,
name: 's',
password: '$2a$10$vD3EaQly4Sj5W3d42GcWeODuFhmHCSjfAJ1YTRMiYAcDBuMnPLfp6',
__v: 0,
snippets: [] } ]

1 个答案:

答案 0 :(得分:2)

您需要使用User.findOne来获取有效的用户对象,此处您将获得一个数组。另外,不要忘记总是在你的承诺中返回一些东西(或抛出错误)。

这是对您的功能的快速重写。通过一些改进,例如箭头函数,const和平坦的承诺链(从不在另一个.then中使用任何.then)并避免代码重复

const name = request.session.name.name
User.findOne({ name })
  .then(user => {
    if (user) return user.save()

    // What to do if not found? Throw an error?
    throw new Error('User not found')
  })
  .then(() => {
    const newSnippet = new Snippet({
      user: user._id,
      title: title,
      body: snippet,
    })

    return newSnippet.save()
  })
  .catch((error) => console.log(error.message))
  .then(() => response.redirect('/'))