Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express.js和MongoDB:将请求放入嵌套对象_Javascript_Mongodb_Express_Mongoose_Mongoose Schema - Fatal编程技术网

Javascript Express.js和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

我试图发出一个PUT请求来更新单个项目的数据,每个项目都包含一个MongoDB文档。它适用于所有键,但
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突出显示它不兼容,不幸的是它不起作用。