2016-07-17 38 views
6

Próbuję dodać właściwość do instancji sequelize przed przekazaniem jej z powrotem do klienta.Dodaj właściwość do obiektu zwróconego przez Sequelize FindOne

router.get('/cats/1', function (req, res) { 
    Cat.findOne({where: {id: 1}}) 
     .then(function (cat) { 
      // cat exists and looks like {id: 1} 
      cat.name = "Lincoln"; 
      // console.log of cat is {id: 1, name: Lincoln} 
      res.json(cat); 
     }); 
}); 

Klient zobaczyć tylko na {id: 1} a nie nowo dodany klucz.

  • Co się tutaj dzieje?
  • Jaki typ obiektu jest zwracany przez Sequelize?
  • Jak mogę dodać nowe właściwości do moich kotów i odesłać je?
+0

Zwrócony obiekt nie jest zwykłym obiektem, ale instancją modalną. Spójrz na [Pobieranie danych/Wyszukiwarki] (http://docs.sequelizejs.com/en/latest/docs/models-usage/) – DavidDomain

+0

Nie chcę zapisywać żadnych nowych wystąpień do mojego DB. Po prostu chcę, aby 'res.json (cat)' zawierał jakiekolwiek nowe właściwości, które dodaję do instancji 'cat'. – Rastalamm

Odpowiedz

7

Klasa Sequelize Model (z których twoje koty są przypadki) ma toJSON() metodę, która przypuszczalnie będzie res.json wykorzystać do serialise swoje koty. Metoda zwraca wynik Model#get() (https://github.com/sequelize/sequelize/blob/95adb78a03c16ebdc1e62e80983d1d6a204eed80/lib/model.js#L3610-L3613), który używa tylko atrybutów zdefiniowanych w modelu. Jeśli chcesz, aby móc ustawić nazwę koty, ale nie nazwiska przechowywać w DB, można użyć kolumny wirtualny przy definiowaniu modelu cat:

sequelize.define('Cat', { 
    // [other columns here...] 
    name: Sequelize.VIRTUAL 
}); 

Ewentualnie, jeśli nie chcesz, aby dodać właściwości do definicji modelu:

cat = cat.toJSON(); // actually returns a plain object, not a JSON string 
cat.name = 'Macavity'; 
res.json(cat); 
+0

Chociaż może to działać, nie wydaje się, że jest to najlepsze podejście. Próbuję zmodyfikować obiekt, przypisując mu nowy klucz i przekazując zmodyfikowany obiekt, z oryginalnymi parami klucz/wartość + nowym kluczem/para wartości (zamiast instancji DB) do klienta. – Rastalamm

+0

Jestem ciekawy - jaki jest twój przypadek użycia do dodawania właściwości po pobraniu bazy danych? Jeśli masz ochotę dodać właściwość wirtualną, wykonujesz pracę w niewłaściwym miejscu, ponieważ jest ona zbyt blisko bazy danych, zachęcam do myślenia o instancjach Sequelize jako poręcznym sposobie modelowania obiektów danych, które po prostu zapełniają się Baza danych. Jedyny inny sposób, jaki mogę wymyślić, aby osiągnąć twój cel, to najpierw wywołać 'cat.toJSON()' (które faktycznie zwraca obiekt, a nie ciąg json) i ustawić na nim niestandardową właściwość. –

+0

Myślę, że twoja sugestia 'cat.toJSON()' jest odpowiednia dla mnie. Przypadek użycia jest następujący. Chwytam niektóre informacje DB, uruchamiam pewne funkcje matematyczne na wyjściach, następnie zwracam do klienta oryginalne liczby, a także niektóre nowe właściwości, które odnoszą się do wyjść z funkcji matematycznych. – Rastalamm