Meteor 1.4,如何访问包中用户定义的集合

Meteor 1.4, how to access a user defined collection in a package

本文关键字:包中 用户 定义 集合 访问 何访问 Meteor      更新时间:2023-09-26

背景:

因此,我正在为流星1.4.2创建一个带有react的管理包,这样我就可以学习如何做这类事情。管理包将只能更新用户定义的集合(插入、删除、修改(。

我在imports/api/posts.js:下的应用程序中有这个文件

// imports/api/posts.js
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
export const Posts = new Mongo.Collection('posts');
if (Meteor.isServer) {
   Meteor.publish('posts', function postsPublication() {
      return Posts.find();
   });
}

例如,我可以使用import { Posts } from '../imports/api/posts.js';在应用程序中轻松访问此文件。

问题:

如何从管理包中访问相同的Posts集合,以便插入新项目、删除项目等?

此外,我早些时候看到了这篇关于类似事情的帖子,但这是否意味着像yogiben:admin这样的包也不适用于模块系统?

理解这一点的关键是认识到一些meteor包是库,有些是此处定义的(meteor(框架的扩展。

yogiben:admin是Meteor框架的扩展,因为它需要能够找到您编写的代码(您的集合(才能正确工作。

如何实现这一点取决于您。以前的集合是全局定义的,因此它们将被(自动/急切地(导入,并且通常在/client/server目录之外,因此它们在客户端和服务器上都可以访问。

现在您可以选择在/imports目录之外定义您的集合,并且它们仍然会被急切地导入,或者将它们导入到您的管理框架需要它们的地方。作为第三种方式,您可以要求它们附加到(服务器端(global对象,例如作为dict(即global.myCollections = {'posts': Posts}(,以及(在浏览器中(window对象(带有window.myCollections = {'posts': Posts}(。

yogiben:admin的示例启动器repo将所有内容都保留在/imports之外,但我怀疑,如果您只是将集合定义保留在CCD14之外,并将其余代码移到当前推荐的项目结构中,这仍然可以正常工作。

我不认为Meteor有办法在应用程序内部定义所有集合。

为了实现这一点,您可以覆盖Mongo.Collection方法,以保留对每个创建的集合的引用。

const _oldCollection = Mongo.Collection;
Mongo.Collection = function(name, options) {
  const c = new _oldCollection(name, options);
  Meteor.myCollections[name] = c;
  return c;
};

然后将其用作:

// define new collection
new Mongo.Collection('questions');
// retrieve collection
const c = Meteor.myCollections['questions'];

在使用Mongo.Collection定义新集合之前,请确保加载了用于覆盖CCD_15的代码。