Хобрук: Ваш путь к мастерству в программировании

Meteor.js Публикация и подписка?

Итак, я немного запутался в Meteor.js. Я создал сайт с ним для тестирования различных концепций, и он отлично работал. После того, как я удалил «небезопасный» и «автопубликацию», я получаю несколько ошибок «отказано в доступе» при попытке получить и отправить на сервер. Я считаю, что это как-то связано со следующим фрагментом:

Template.posts.posts = function () {
    return Posts.find({}, {sort: {time: -1}});
}

Я думаю, что он пытается получить доступ к коллекции напрямую, что ему было разрешено делать с включенными «небезопасными» и «автопубликацией», но как только они были отключены, ему было отказано в доступе. Еще одна часть, которую я считаю проблематичной:

else {
    Posts.insert({
    user: Meteor.user().profile.name,
    post: post.value,
    time: Date.now(),
});

Я думаю, что происходит то же самое: он пытается получить прямой доступ к коллекции, что ему не разрешено.

Мой вопрос в том, как мне изменить его так, чтобы мне не нужны были «небезопасные» и «автопубликации»?

Спасибо.

ИЗМЕНИТЬ

Финал:

/** 
* Models
*/
Posts = new Meteor.Collection('posts');

posts = Posts

if (Meteor.isClient) {

    Meteor.subscribe('posts');


}

if (Meteor.isServer) {

    Meteor.publish('posts', function() {
        return posts.find({}, {time:-1, limit: 100});
   });


    posts.allow({

        insert: function (document) {
            return true;
        },
        update: function () {
            return false;
        },
        remove: function () {
            return false;
        }

    });

}
22.09.2013

  • да, вы объявляете переменную «Сообщения», но пытаетесь получить к ней доступ с помощью «сообщений» на сервере. Вы должны исправить опечатку, так как теперь у вас есть вопрос и ответ, показывающий код, который не запускается. 23.09.2013

Ответы:


1

Итак, в этом вопросе есть две части:

Автопубликовать

Чтобы публиковать базы данных в метеоре, вам нужно иметь код как на стороне сервера, так и на стороне клиента проекта. Предполагая, что вы создали экземпляр коллекции (Posts = new Meteor.Collection('posts')), вам нужно

if (Meteor.isServer) {
    Meteor.publish('posts', function(subsargs) {
        //subsargs are args passed in the next section
        return posts.find()
        //or 
        return posts.find({}, {time:-1, limit: 5}) //etc
   })
}

Тогда для клиента

if (Meteor.isClient) {
    Meteor.subscribe('posts', subsargs) //here is where you can pass arguments
}

Небезопасно

Цель небезопасного — позволить клиенту без разбора добавлять, изменять и удалять любые записи базы данных, которые он хочет. Однако чаще всего вы этого не хотите. После того, как вы удалили insecure, вам нужно настроить правила на сервере, подробно описывающие, кто и что может делать. Эти две функции — db.allow и db.deny. Например.

if (Meteor.isServer) {
    posts.allow({ 
        insert:function(userId, document) {
            if (userId === "ABCDEFGHIJKLMNOP") {  //e.g check if admin
                return true;
            }
            return false;
        },
        update: function(userId,doc,fieldNames,modifier) {
            if (fieldNames.length === 1 && fieldNames[0] === "post") { //they are only updating the post
                return true;
            }
            return false;
        },
        remove: function(userId, doc) {
            if (doc.user === userId) {  //if the creator is trying to remove it
                return true;
            }
            return false;
        }
    });
}

Точно так же db.deny будет вести себя точно так же, за исключением того, что ответ true будет означать «не разрешать это действие».

Надеюсь, это ответит на все ваши вопросы

22.09.2013
  • Когда вы говорите insert:function(userId, document) или update: function(userId,doc,fieldNames,modifier), как вы передаете эти аргументы? И вы делаете это с клиента или сервера? 24.03.2015
  • Вы не вызываете эти функции как таковые. Они вызываются метеором при определенных событиях и передают эти аргументы вызывающей стороне. Имеет ли это смысл? 24.03.2015
  • Ммм, так они вызываются определенными событиями... но я не уверен, что понимаю, как передаются аргументы. Не могли бы вы привести (или дать ссылку) пример, в котором фрагмент клиентского кода запускает функции вставки/обновления/удаления и передаются аргументы? 25.03.2015
  • Если на стороне клиента вы вызываете db.update, например posts.remove({key: value}), то функция, которую вы передаете posts.allow({remove: .... }) на стороне сервера, будет вызываться с идентификатором пользователя клиента и документом, который они пытаются удалить. Если эта функция возвращает true, им разрешено ее удалить. В противном случае документ остается. update и insert ведут себя одинаково 25.03.2015
  • Прохладно! Но откуда берется userId клиента, если не из клиентского вызова posts.remove/update/insert напрямую? 26.03.2015
  • Клиентская функция, которую вы вызываете с помощью posts.xxxx, среди прочего автоматически захватит ваш идентификатор пользователя и затем передаст его на сервер. Сервер выполнит некоторые действия с ним, а затем вызовет соответствующий файл posts.allow, используя его в качестве аргумента. 26.03.2015
  • Ладно, попался. Все, что он захватывает, задокументировано где-нибудь? Большое спасибо за Вашу помощь! 26.03.2015
  • Я не знаю какой-либо документации для этого, но у метеора открытый исходный код, так что вы можете попробовать поискать там (github. com/метеор/метеор). Надеюсь это поможет 26.03.2015
  • Новые материалы

    Блоги, которые обязательно нужно прочитать специалистам по обработке и анализу данных :
    Добро пожаловать в 2020! Новый год и новое десятилетие. Поскольку мы начинаем новый и захватывающий год в науке о данных, важно, чтобы профессионалы открыли для себя лучшие блоги по науке о..

    Универсальный базовый доход
    Универсальный базовый доход В последние годы концепция всеобщего базового дохода (УБД) набирает обороты как все более эффективное решение для борьбы с растущим неравенством доходов и..

    Освоение Python для анализа финансовых данных: руководство по получению данных о доходах от акций
    Если вы хотите научиться получать данные о доходах от акций с помощью Python, то это руководство для вас! В этой статье мы рассмотрим несколько примеров сбора данных о доходах от акций. Мы..

    Абсолютно имеет смысл.
    Абсолютно имеет смысл. Мой репетитор даже предложил то же самое. Одна проблема, с которой я столкнулся, заключается в том, что для каждой из категорий не было ярлыка «хорошо». Если я перебираю..

    МАШИННОЕ ОБУЧЕНИЕ И EDA
    Каковы шаги в машинном обучении Определение проблемы Генерация гипотез Извлечение данных Исследование данных Прогнозное моделирование Развертывание модели Зачем нам ЭДА? Идентификация..

    В чем основные различия между ReactJS и React-Native?
    В чем основные различия между ReactJS и React-Native? Что я узнал, создавая веб-приложения, а затем мобильные приложения на React React-Native существует уже около 2 лет и стал..

    LeetCode — Умножение строк
    Постановка задачи Даны два неотрицательных целых числа num1 и num2 , представленные в виде строк, вернуть произведение num1 и num2 , а также представлен в виде строки. Примечание . Вы..