我正在使用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: [] } ]
答案 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('/'))