Как сделать простой запрос к базе данных в Метеоре

1

Каждый раз, когда у меня появляется новая идея для приложения, я начинаю с Meteor. И каждый раз, когда я в конечном итоге использую что-то другое. И я думаю, это сводится к тому, что я не знаю, как сделать простой запрос к базе данных.

Вот гипотетический пример. Я хочу создать приложение, в котором пользователь вводит что-то в поле, нажимает кнопку, а затем появляется изображение того, что они набрали. Он использует некоторый поиск изображений api.

<template name="image">
    <input type="text" class="description"></input>
    <button class="showImage"></button>
    <img src="{{img}}"></img>
</template>

До сих пор кажется достаточно простым. Теперь нет способа отправить информацию клиенту, не помещая его сначала в базу данных, как я понимаю. Предположим, что мы имеем некоторую функцию addToDB, которая принимает запросы и вводит информацию об изображении в базу данных.

Template.image.events({
    'click .showImage': function() {
        addToDB($('.description').val());
    }
});

Большой! Это все еще не так уж плохо. Но теперь, чтобы отправить данные обратно клиенту...

//server.js
Meteor.publish("image", function(query) {
    Images.find({q: query});
}

Но ждать. Мы не можем просто подписаться, когда клиент загружается, потому что мы еще не знаем запрос. Поэтому, возможно, обработчик событий должен быть

Template.image.events({
    'click .showImage': function() {
        addToDB($('.description').val());
        Deps.autorun(function() {
        Meteor.subscribe("images", $('.description').val());
    });
    }
});

Хорошо, позвольте прокормить это в шаблон...

Template.image.img = function() {
    return Images.findOne().imgsrc;
}

Нет, это приводит к ошибке, потому что, когда шаблон загружен первым, мы еще не подписались на "Изображения". Поэтому мы можем обновить шаблон следующим образом:

<template name="image">
    <input type="text" class="description"></input>
    <button class="showImage"></button>
    {{#each info}}
    <img src="{{info.img}}"></img>
    {{/each}}
</template>

Затем измените функцию заполнения шаблона так:

Template.image.info = function() {
    return Images.find({}, {limit: 1});
}

И вуаля!

Я потратил дольше, чем я готов признать, что сегодня вечером обрушился на все это. Если бы это был просто старый узел, я мог бы использовать простой jQuery.

Но есть миллион удивительных особенностей, которые Meteor имеет, что я действительно хочу использовать. Так что я надеюсь, что кто-то может показать мне дорогу. Какие ошибки я сделал в этом процессе и в конечном итоге? Какой самый красивый, самый чистый, самый простой способ сделать это в приложении метеорита.

Это настолько сложно, в рамках, что делает так много других вещей настолько простыми. Итак, как я могу просто сделать простой запрос к базе данных?

Теги:
database
meteor
meteorite

1 ответ

2
Лучший ответ

Рассмотрим глядя на примеры метеорных они обеспечивают. Все примеры имеют функциональные возможности ввода пользовательского ввода, управления коллекциями и отображения запросов коллекции к шаблонам.

Большая часть вашего кода выглядит хорошо, но вы задаете сразу несколько вопросов и начинаете с перспективы, которая затрудняет ответ. Некоторые общие замечания:

  • рассмотрите возможность использования Session для хранения переменных, которые пользователь устанавливает с событием.
  • подпишитесь на нужные вам данные, передав переменную Session в функцию Deps.autorun
  • отобразите нужные данные, передав переменную Session в шаблон.
  • основные правила javascript по-прежнему применяются - null.someThingIWant - ошибка. Удобный шаблон return something && something.someThingIWant;

Одна из проблем в приведенном выше коде заключается в том, что ваша публикация не возвращает результаты запроса. Я предполагаю, что это опечатка.

  • 0
    Спасибо, это тот ответ, который я искал. Переменные сеанса и этот последний шаблон - вещи, о которых я не думал.
  • 0
    @fnsjdnfksjdb: не забудьте поднять голос и принять ответ, если он вам помог!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню