为我的数据库添加种子,或以编程方式在 ApostropheCMS 中插入数据

Seed my database, or insert data programatically in ApostropheCMS

我想用大量博客文章对我的数据库做一个非常快速和肮脏的 "seed"...我很高兴使用 Mongo 游标等,但是不能'似乎找不到一个有效的生命周期方法来 "plonk" 将此代码放入...这一切都是为了概念验证,因此不需要完美!

有人能给我指出正确的方向吗?我似乎无法在 construct 方法中访问 req,所以不能 self.insert 那里...

查看 apostrophe-tasks 模块。这使您可以轻松地在自己的模块中添加命令行任务,并轻松获得具有完全管理员权限的 req 对象来完成此类工作。

您的模块可以从 construct:

中调用 self.apos.tasks.add
self.apos.tasks.add(self.__meta.name, 'insert-stuff', function(apos, argv, callback) {
  var req = self.apos.tasks.getReq();
  return self.find(req, { cool: true }).toArray().then(function(err, pieces) {
    if (err) {
      return callback(err);
    }
    // etc., do things with `pieces`, then invoke callback(null);
  });
};

根据@Tom Boutell 的回复,这是我的最终工作代码...

    construct: function(self, options) {
      self.apos.tasks.add(self.__meta.name, 'insert-blog-articles', function(apos, argv, callback) {
        console.info(`Running ${self.__meta.name}:insert-blog-articles`)

        if(!argv.create) throw new Error('Please pass a number of articles to create using --create=n')

        const req = self.apos.tasks.getReq()
        const numberToCreate = Array.from(Array(argv.create).keys())

        numberToCreate.forEach(item => {
          let blogPost = self.newInstance()

          blogPost = Object.assign({}, blogPost, {
            title: 'Post about cats!',
            image: 'https://www.vetbabble.com/wp-content/uploads/2016/11/hiding-cat.jpg',
            published: true,
            testData: true
          })

          self.insert(req, blogPost)
            .then(result => { console.info('Inserted doc!', result) })
          })
        })

        self.apos.tasks.add(self.__meta.name, 'show-hide-articles', function(apos, argv, callback) {
          console.info('Running task show-hide-articles', argv)

          const set = argv.show ? { published: true } : { published: false }

          self.apos.docs.db.update(
            { type: 'apostrophe-blog', testData: true },
            { $set: set },
            { multi: true }
          )
          .then(result => {
            argv.show && console.info('Docs updated, now showing posts')
            !argv.show && console.info('Docs updated, now hiding posts')
          })
          .catch(error => { console.warn('Error updating docs', error) })
        })
    }

哪个(粗略地)给了我两个任务:

node app apostrophe-blog:insert-blog-articles --create=100 --> 为我创建 100 篇博客文章

node app apostrophe-blog:show-hide-articles --show --> 将这些文章 published 标志设置为 true 或 false,具体取决于 arg