尝试保存对象 ID 猫鼬数组的问题
Issue Trying to Save an Array of Object Ids Mongoose
我正在使用 mongoose
和 express
分别创建我的数据库和服务器。
我的数据有如下架构:
const mongoose = require('mongoose')
const {Schema} = mongoose
const quotesSchema = new Schema({
tags: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Tags' // I want to save an array of tags coming in from the request body
}
],
content: {
type: String,
required: true
},
author: {
type: String,
required: true
},
authorSlug: {
type: String,
},
dateAdded: {
type: Date,
default: Date.now()
},
dateModified: {
type: Date,
default: Date.now()
},
})
const Quotes = new mongoose.model('Quotes', quotesSchema)
module.exports = Quotes
我想保存来自请求正文的一组标签,但它只保存了数组中的一项。
这是我的示例代码:
router.post('/', async (req, res, next) => {
try {
const {tags, author, content} = req.body
const slug = author.replace(/\s+/g, '-').toLowerCase()
var tagIds = []
tags.forEach( async (tag) => {
const foundTag = await Tag.find({name: tag}) // I first of all search my tag collection
// to see if the names supplied in the request body tags array exist,
// then try to extract their Objectids and store in an array to move to the next step - saving the quote
// foundTag.forEach(async (item) => {
// return await tagIds.push(item._id)
// })
for (var i = 0; i < foundTag.length; i++) {
tagIds.push[i]
}
console.log(tagIds)
const quote = new Quote({
tags: tagIds,
content,
author,
authorSlug: slug
})
const quoteToSave = await quote.save()
return res.status(201).json({
success: true,
msg: 'Quote Created Successfully',
quote: quoteToSave
})
})
} catch (error) {
console.error(error)
}
})
如何将完整的标签数组作为参数传递给我的报价以进行保存。我认为这里的问题是它没有等待第二个标签进入数组。
这是我在 Postman 中请求-响应的图片:
如何从 req.body
中获取作为数组的标签并将其保存为我的引用对象的一部分?目前我正在 forEach
循环中做所有事情,但对我来说似乎不够体面。有没有最好的方法,比如等待数据,然后保存部分不会像当前那样有任何父控制语句。
谢谢
#1 如果您将在 forEach
中使用 async functions
,则将 Promise.all()
与 bluebird
一起使用。
#2 MongoDB operators
很有用。
#3 了解 forEach
和 map
之间的区别非常重要。
#4 express response 正确使用的话不需要return
声明
最终代码如下所示:
router.post('/', async (req, res, next) => {
const { tags, author, content } = req.body
const slug = author.replace(/\s+/g, '-').toLowerCase()
var foundTags = await Tag.find({ name: { $in: tags } })
if (foundTags) {
var tagsIds = []
foundTags.map(tag => {
tagsIds.push(tag._id);
})
const quote = new Quote({
tags: tagsIds,
content,
author,
authorSlug: slug
})
const quoteToSave = await quote.save()
if (quoteToSave) {
res.status(201).json({
success: true,
msg: 'Quote Created Successfully',
quote: quoteToSave
})
} else {
res.status(500).json("failed saving quote")
}
} else {
res.status(500).json("failed finding tags")
}
})
我正在使用 mongoose
和 express
分别创建我的数据库和服务器。
我的数据有如下架构:
const mongoose = require('mongoose')
const {Schema} = mongoose
const quotesSchema = new Schema({
tags: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Tags' // I want to save an array of tags coming in from the request body
}
],
content: {
type: String,
required: true
},
author: {
type: String,
required: true
},
authorSlug: {
type: String,
},
dateAdded: {
type: Date,
default: Date.now()
},
dateModified: {
type: Date,
default: Date.now()
},
})
const Quotes = new mongoose.model('Quotes', quotesSchema)
module.exports = Quotes
我想保存来自请求正文的一组标签,但它只保存了数组中的一项。
这是我的示例代码:
router.post('/', async (req, res, next) => {
try {
const {tags, author, content} = req.body
const slug = author.replace(/\s+/g, '-').toLowerCase()
var tagIds = []
tags.forEach( async (tag) => {
const foundTag = await Tag.find({name: tag}) // I first of all search my tag collection
// to see if the names supplied in the request body tags array exist,
// then try to extract their Objectids and store in an array to move to the next step - saving the quote
// foundTag.forEach(async (item) => {
// return await tagIds.push(item._id)
// })
for (var i = 0; i < foundTag.length; i++) {
tagIds.push[i]
}
console.log(tagIds)
const quote = new Quote({
tags: tagIds,
content,
author,
authorSlug: slug
})
const quoteToSave = await quote.save()
return res.status(201).json({
success: true,
msg: 'Quote Created Successfully',
quote: quoteToSave
})
})
} catch (error) {
console.error(error)
}
})
如何将完整的标签数组作为参数传递给我的报价以进行保存。我认为这里的问题是它没有等待第二个标签进入数组。
这是我在 Postman 中请求-响应的图片:
如何从 req.body
中获取作为数组的标签并将其保存为我的引用对象的一部分?目前我正在 forEach
循环中做所有事情,但对我来说似乎不够体面。有没有最好的方法,比如等待数据,然后保存部分不会像当前那样有任何父控制语句。
谢谢
#1 如果您将在 forEach
中使用 async functions
,则将 Promise.all()
与 bluebird
一起使用。
#2 MongoDB operators
很有用。
#3 了解 forEach
和 map
之间的区别非常重要。
#4 express response 正确使用的话不需要return
声明
最终代码如下所示:
router.post('/', async (req, res, next) => {
const { tags, author, content } = req.body
const slug = author.replace(/\s+/g, '-').toLowerCase()
var foundTags = await Tag.find({ name: { $in: tags } })
if (foundTags) {
var tagsIds = []
foundTags.map(tag => {
tagsIds.push(tag._id);
})
const quote = new Quote({
tags: tagsIds,
content,
author,
authorSlug: slug
})
const quoteToSave = await quote.save()
if (quoteToSave) {
res.status(201).json({
success: true,
msg: 'Quote Created Successfully',
quote: quoteToSave
})
} else {
res.status(500).json("failed saving quote")
}
} else {
res.status(500).json("failed finding tags")
}
})