Nano Hash - криптовалюты, майнинг, программирование

Ember Data не создает идентификатор для новых экземпляров

Я создал прототип приложения Ember с помощью адаптера локального хранилища.

Сейчас я пытаюсь преобразовать приложение для использования адаптера Ember Data REST с внутренним хранилищем.

В версии приложения для локального хранилища Ember генерирует идентификатор для новой записи перед ее сохранением (а также даже в том случае, если запись никогда не сохраняется).

Например, в моем приложении для локального хранения я могу зарегистрировать идентификатор в обоих местах.

var gecko = this.store.createRecord('gecko', {
    date: new Date(),
    type: "gecko",                                     
    });
  console.log(gecko.id, "gecko.id before save");
  gecko.save();
  console.log(gecko.id, "gecko.id");

Напротив, в версии приложения, которое я делаю с адаптером REST для внутреннего хранилища, идентификатор не регистрируется.

Когда я проверяю данные, которые Ember отправляет на сервер, идентификатор не включается (вероятно, потому, что идентификатор никогда не был сгенерирован).

Вот json, который Ember отправляет на мой сервер

  gecko: { type: "alloc", date: "2015-05-30T13:28:27.539Z"}

Я предполагаю, что я должен сохранить идентификатор, сгенерированный Ember, на моем сервере (что, конечно, позволит ему получить запись по идентификатору, если мой сервер реализует это).

Вопрос: почему не генерируется идентификатор?

это код

    App = Ember.Application.create();

    App.Router.map(function() {
      this.route("gecko", { path: "/" });

    });
    App.ApplicationAdapter = DS.RESTAdapter.extend({
    //haven't actually any created any code for this part yet
    });
    App.ApplicationStore = DS.Store.extend({
      adapter: App.ApplicationAdapter.create() 
    });
    App.Gecko = DS.Model.extend({
      type: DS.attr('string'),
      date: DS.attr('date')
    })
    App.GeckoRoute = Ember.Route.extend({

      model: function() {
       //currently does nothing. originally I tried to do `return this.store.find('gecko') but since there are no records yet on the backend, it's returning null which leads to an error which Array cannot map over
      },
    });
App.GeckoController = Ember.Controller.extend({

  actions: {
       createGeckoButtonClicked: function(){

            var gecko = this.store.createRecord('gecko', {
                date: new Date(),
                type: "gecko",                                     
            });
            console.log(gecko.id, "gecko.id before save"); //null
            gecko.save();
            console.log(gecko.id, "gecko.id"); //null
       }


  }

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

Поэтому я пытаюсь настроить приложение Ember так, чтобы оно могло отправлять запись на сервер POST, а затем я реализую маршрут для ее получения с помощью return this.store.find('gecko').


Ответы:


1

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

var gecko = this.store.createRecord('gecko', {
    date: new Date(),
    type: "gecko",                                     
});

/*
   Here ember-data expects a payload like this:
        gecko: {id: 1, date: "", type: "gecko"}
   The id is generated by your backend
*/
gecko.save().then(function(gecko){
    console.log(gecko.get('id'))
})
30.05.2015
  • поэтому вызов gecko.save() должен НЕМЕДЛЕННО возвращать экземпляр того, что я сохранил, или это то, что вы делаете просто для иллюстрации? 30.05.2015
  • Как вы можете прочитать здесь, метод save возвращает обещание это будет разрешено, когда адаптер успешно вернется, передав обратному вызову модель, которая была сохранена в вашей базе данных. 30.05.2015

  • 2

    Ember Data не создает идентификаторы, ничто не мешает ему генерировать неуникальные идентификаторы. Когда дело доходит до gecko записей, это не источник правды, а ваша база данных, поэтому генерация идентификаторов принадлежит базе данных. Вот где POST против PUT вступает в игру. Я хочу отправить новую запись gecko в /api/geckos или поместить gecko запись 123 на ее место в /api/geckos/123.

    Если в базе данных нет записей, вы все равно должны вернуть правильный ответ:

    {
        geckos: []
    }
    

    И две другие быстрые вещи: вы должны использовать геттеры/сеттеры для выборки и установки свойств.

    var gecko = this.store.createRecord('gecko', {
      date: new Date(),
      type: "gecko",                                     
    });
    console.log(gecko.get('id'), "gecko.id before save");
    var promise = gecko.save();
    

    А save — это асинхронный процесс, который возвращает обещание, которое вы можете подождать, чтобы избежать условий гонки.

    promise.then(function(geckoRecord){
       // geckoRecord and geck are the same here, but it's good to know
       // it resolves the record
       console.log(gecko.get('id'), "gecko.id after save");
       console.log(geckoRecord.get('id'), "gecko.id after save");
    });
    
    30.05.2015
  • Я попытался присвоить идентификатор один раз в модели (на стороне клиента), и это выдало ошибку, поэтому, если я назначу идентификатор в базе данных, разве вы не ожидаете, что эта ошибка будет вызвана снова? Если вы можете прокомментировать, пожалуйста, сделайте это, но я попробую это и вернусь к вам, чтобы принять ваш ответ (пока что я только что проголосовал) или иным образом прокомментировать. Спасибо за вашу помощь. 30.05.2015
  • Технически вы можете назначить идентификаторы на стороне клиента, но, как правило, это нежелательный шаблон, вы просто не можете определить атрибут id в модели, потому что предполагается, что он там есть. emberjs.jsbin.com/yuyizenida/1/edit?html,js, вывод 30.05.2015
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..