【问题标题】:Let publication return modified/"fake"/non-database data, still queryable by client让发布返回修改/“假”/非数据库数据,客户端仍然可以查询
【发布时间】:2018-07-09 10:12:39
【问题描述】:

标准出版物看起来像这样:

Meteor.publish('suggestions', function(query){
    return MyDB.find({param: query});
}

一旦订阅,结果就可以通过简单的MyDB.find(...);在客户端访问。

但是,我将如何实现

(a) 某种预处理,意味着我在服务器端向查询的文档添加或删除某些属性,然后客户端应该仍然可以查询?

(b) 返回虚假数据,即遵循数据库架构且仍可在客户端查询的数据,但实际上不存在于服务器端?

例子:

Meteor.publish('suggestions', function(query){
    //Stuff in database: [{prop1: 'first'}, {prop1: '2nd'}]
    if(query == 'something') { //Fake data
        return [{prop1: 'hello', prop2: 42}];
    } else {
        result = MyDB.find().fetch();
        result.forEach(function(element) {
            element.prop2 = random_number;
        }
        return result;
    }
}

因此,如果我随后在客户端订阅“建议”,我希望看到以下内容:

//Subscribed with query 'something':
var arr = MyDB.find().fetch();
//arr equals [{prop1: 'hello', prop2: 42}]

Subscribed with another query
var arr = MyDB.find().fetch();
//arr equals [{prop1: 'first', prop2: random_number}, {prop1: '2nd', prop2: random_number}]

基本上,如上所述,我希望在发送到客户端之前对数据库数据进行一些或完全修改,但是客户端应该能够像直接来自数据库一样查询它。

我该怎么做呢?

【问题讨论】:

  • 以后在客户端更改文档是否有任何安全隐患?如果没有,我建议您在客户端而不是服务器上发布处理数据,以确保服务器集合的数据完整性。
  • 是的 - 我要修改的数据是动态的,因为它取决于其他集合的状态,我不希望用户访问的集合。 (甚至不是因为用户会看到重要数据,而仅仅是因为我必须向用户发送太多数据)

标签: database meteor subscription meteor-publications


【解决方案1】:

我相信

中给出的答案

Meteor : how to publish custom JSON data?

我有类似的需求,这个答案帮助了我。 您应该直接操作“add”、“changed”、“ready()”等属性。

甚至评估使用“Meteor.call()”是否会更好

【讨论】:

  • 感谢您的回答。我确实考虑过使用 Meteor.call,但出于各种原因决定放弃它,其中一半甚至我都不记得了。我会看看我是否可以将您链接到我的项目中的答案也实现。
【解决方案2】:

我回答了How do you publish and subscribe to data that's not Mongo db?的类似问题

我在该答案中提供了参考和指南。

请注意,该问题中的客户端订阅者是在 React.js 中实现的,但我认为在服务器端发布数据的方式几乎相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2015-09-24
    • 2020-09-26
    • 2019-12-03
    • 1970-01-01
    • 2021-03-27
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多