推送到子文档数组时难以在子文档上进行验证

时间:2019-05-25 20:58:07

标签: javascript node.js mongodb mongoose

我的目标是在MongoDB数据库中创建一个用户。每个用户(在Spotify上)将拥有一系列他们关注的艺术家。因此,当他们第一次注册时,其艺术家字段是一个空数组。然后,他们被重定向到一个端点,该端点找到其跟随的艺术家,并将每个艺术家推入阵列。这样,我可以比较在继续进行后续访问之前特定用户的艺术家中是否已经存在artistId。

我目前有一个用户模式和一个艺术家模式,都具有必填字段。 User模式具有Artist模式的数组,但不是必需的(因为它被初始化为空)。

User.js(架构):

const mongoose = require('mongoose');
const artist = require('../models/artist');

const userSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId, // place for a unique id
  display_name: { type: String, required: 'User must have a username' },
  email: { type: String, required: 'User must have an email' },
  href: { type: String, required: 'User must have a HREF' },
  spotifyId: { type: String, required: 'User must have an ID' },
  img: { type: String, required: 'User must have an img' },
  artists: [artist.schema]
});

module.exports = mongoose.model('User', userSchema)

和Artist模式:

const mongoose = require('mongoose');

const artistSchema = mongoose.Schema({
  //_id: mongoose.Schema.Types.ObjectId, // place for a unique id
  artistId: { type: String, required: 'Artist must have an ID' }, // id from spotify
  name: { type: String, required: 'Artist must have a username' },
  href: { type: String, required: 'Artist must have a URL' },
  alert: { type: Boolean, default: true },
  lastUpdate: { type: Date, default: Date.now }
});

module.exports = mongoose.model('Artist', artistSchema)

如果我发布到http://localhost:3000/users/12345/artists,这就是运行的代码。注意:整个js文件正在处理http://localhost:3000/users/12345/artists之后的请求,因此userId被我自己的中间件添加到请求中,这使我可以使用req.userId在这些方法中访问它

router.post('/', (req, res, next) => {
  User.findById(req.userId)
  .exec()
  .then(doc => {
    const artist = new Artist({
      artistId: req.body.artistId,
      name: req.body.name,
      href: req.body.href,
      alert: req.body.alert
    });
    doc.artists.push(artist);
    res.send(doc.artists);
  })
  .catch(error => {
    res.send(error);
  });
});

问题是:我没有希望对Artist进行任何验证。不添加艺术家的href时,我不会收到任何错误。

我对NodeJS相当陌生,这实际上是我关于SO的第一篇文章,所以也许我错过了一些简单的东西。如果您需要任何其他信息,请告诉我。

0 个答案:

没有答案