Javascript Express.js和MongoDB:将请求放入嵌套对象
我试图发出一个PUT请求来更新单个项目的数据,每个项目都包含一个MongoDB文档。它适用于所有键,但Javascript Express.js和MongoDB:将请求放入嵌套对象,javascript,mongodb,express,mongoose,mongoose-schema,Javascript,Mongodb,Express,Mongoose,Mongoose Schema,我试图发出一个PUT请求来更新单个项目的数据,每个项目都包含一个MongoDB文档。它适用于所有键,但socialLinks键除外,该键由对象twitter、facebook和instagram组成 我可以使用以下代码将数据发布到这些对象: router.post( '/', [ auth, [ check('itemName', 'Name is required') .not() .isEmpty(), chec
socialLinks
键除外,该键由对象twitter
、facebook
和instagram
组成
我可以使用以下代码将数据发布到这些对象:
router.post(
'/',
[
auth,
[
check('itemName', 'Name is required')
.not()
.isEmpty(),
check('companyName', 'Company name is required')
.not()
.isEmpty(),
check('thumbnailFileName', 'Thumbnail is required').isURL(),
check('tagline', 'Tagline is required')
.not()
.isEmpty(),
check('description', 'Description is required')
.not()
.isEmpty(),
check('topics', 'At least one topic is required')
.not()
.isEmpty(),
check('website', 'At least one topic is required').isURL(),
check('availability', 'Availability is required')
.not()
.isEmpty(),
check('socialLinks.twitter', 'Please enter a valid URL').isURL(),
check('socialLinks.facebook', 'Please enter a valid URL').isURL(),
check('socialLinks.instagram', 'Please enter a valid URL').isURL()
]
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const {
itemName,
companyName,
thumbnailFileName,
tagline,
description,
topics,
website,
availability,
makers,
socialLinks: { twitter, facebook, instagram }
} = req.body;
try {
const newItem = new Item({
user: req.user.id,
itemName,
companyName,
thumbnailFileName,
tagline,
description,
topics,
website,
availability,
makers,
socialLinks: { twitter, facebook, instagram }
});
const item = await newItem.save();
res.json(item);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
}
);
但是我在用我的PUT路径更新socialLinks
数据时遇到了一些问题:
router.put('/:id', auth, async (req, res) => {
const {
itemName,
companyName,
thumbnailFileName,
tagline,
description,
topics,
website,
availability,
makers,
socialLinks
// socialLinks: { twitter, facebook, instagram }
} = req.body;
// Build item object
const itemFields = {};
if (itemName) itemFields.itemName = itemName;
if (companyName) itemFields.companyName = companyName;
if (thumbnailFileName) itemFields.thumbnailFileName = thumbnailFileName;
if (tagline) itemFields.tagline = tagline;
if (description) itemFields.description = description;
if (topics) itemFields.topics = topics;
if (website) itemFields.website = website;
if (availability) itemFields.availability = availability;
if (makers) itemFields.makers = makers;
if (socialLinks) itemFields.socialLinks = socialLinks;
// if ({socialLinks: { twitter, facebook, instagram }}) itemFields.socialLinks[{socialLinks: { twitter, facebook, instagram }}] = {socialLinks: { twitter, facebook, instagram }};
try {
let item = await Item.findById(req.params.id);
if (!item) return res.status(404).json({ msg: 'Item not found' });
// Make sure user owns item
if (item.user.toString() !== req.user.id) {
return res.status(401).json({ msg: 'Not authorized' });
}
item = await Item.findByIdAndUpdate(
req.params.id,
{ $set: itemFields },
{ new: true }
);
res.json(item);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});
我试过各种组合来让它工作。在PUT路径中,如果我只分解socialLinks
并且在itemFelds
中只包含if(socialLinks)itemFields.socialLinks=socialLinks
,则我可以同时更改一个或多个社交链接
,但如果我没有包括所有社交链接
,则我没有包括在PUT请求中的链接将被删除
猫鼬模式:
const mongoose = require('mongoose');
const ItemSchema = mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
refer: 'users'
},
itemName: {
type: String,
required: true
},
companyName: {
type: String,
required: true
},
thumbnailFileName: {
type: String,
required: true
},
tagline: {
type: String,
required: true
},
description: {
type: String,
required: true
},
topics: [
{
type: String,
required: true
}
],
website: {
type: String
},
availability: {
type: String,
required: true
},
makers: [
{
type: String
}
],
socialLinks: {
twitter: {
type: String
},
facebook: {
type: String
},
instagram: {
type: String
}
},
date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('item', ItemSchema);
您是否尝试过
={socialLinks:{twitter | | null,facebook | | null,instagram | | | null}
我尝试过,VScode突出显示它不兼容,不幸的是它不起作用。您尝试过={socialLinks:{twitter | | null,facebook | | null,instagram | null}
我试过了,VScode突出显示它不兼容,不幸的是它不起作用。