Pytanie Sequelize - Jak mogę zwrócić obiekty JSON tylko z wyników bazy danych?


Tak więc chcę, aby wyniki bazy danych zostały zwrócone i nic więcej. W tej chwili otrzymuję dużą część danych JSON (jak poniżej):

Ale potrzebuję tylko atrybutu [dataValues]. Nie chcę tego używać JSON aby go odzyskać: tagData[0].dataValues.tagId.

Właśnie zauważyłem: kiedy to znajdzie i NIE TWORZY, zwróci wartość JSON dla wyników bazy danych, ale kiedy to NIE ZNAJDUJE SIĘ i tworzy, zwraca niepotrzebny blob JSON (jak poniżej) Czy istnieje sposób obejścia tego?

[ { dataValues:
     { tagId: 1,
       tagName: '#hash',
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },
    _previousDataValues:
     { tagId: 1,
       tagName: '#hash',
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },
    _changed:
     { tagId: false,
       tagName: false,
       createdAt: false,
       updatedAt: false },
    '$modelOptions':
     { timestamps: true,
       instanceMethods: {},
       classMethods: {},
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       whereCollection: [Object],
       schema: null,
       schemaDelimiter: '',
       defaultScope: null,
       scopes: [],
       hooks: {},
       indexes: [],
       name: [Object],
       omitNull: false,
       sequelize: [Object],
       uniqueKeys: [Object],
       hasPrimaryKeys: true },
    '$options':
     { isNewRecord: true,
       '$schema': null,
       '$schemaDelimiter': '',
       attributes: undefined,
       include: undefined,
       raw: true,
       silent: undefined },
    hasPrimaryKeys: true,
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  true ]

Zamiast zdobywania dużych rozmiarów, jak powyżej, potrzebuję tylko tego RAW Wyniki json (jak poniżej):

{ tagId: 1,
       tagName: '#hash',
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },

Użyłem następującego javascript. Próbowałem dodać raw: true, ale to nie zadziałało?

    // Find or create new tag (hashtag), then insert it into DB with photoId relation
module.exports = function(tag, photoId) {
    tags.findOrCreate( { 
        where: { tagName: tag },
        raw: true
    })
    .then(function(tagData){
        // console.log("----------------> ", tagData[0].dataValues.tagId);
        console.log(tagData);
        tagsRelation.create({ tagId: tagData[0].dataValues.tagId, photoId: photoId })
        .then(function(hashtag){
            // console.log("\nHashtag has been inserted into DB: ", hashtag);
        }).catch(function(err){
            console.log("\nError inserting tags and relation: ", err);
        });
    }).catch(function(err){
        if(err){
            console.log(err);
        }
    });

}

Edytować:

Zbadałem więc trochę i wydaje mi się, że to wielkie JSON blob jest zwracany tylko wtedy, gdy Sequelize tworzy i nie znajduje.

Czy jest jakiś sposób obejścia tego, czy nie?

Edytuj 2:

Okej, więc znalazłem obejście, które można przekształcić w funkcję wielokrotnego użytku. Ale jeśli coś jest wbudowane Sequelize, Wolałbym to wykorzystać.

var tagId = "";

// Extract tagId from json blob
if(tagData[0].hasOwnProperty('dataValues')){
    console.log("1");
    tagId = tagData[0].dataValues.tagId;
} else {
    console.log("2");
    console.log(tagData);
    tagId = tagData[0].tagId;
}

console.log(tagId);
tagsRelation.create({ tagId: tagId, photoId: photoId })

Edytuj 3:

Tak więc, nie sądzę, że istnieje "oficjalny" sposób na osiągnięcie tego celu, więc napisałem niestandardowy moduł, który zwraca JSON potrzebne dane. Ten moduł można dostosować i rozszerzyć, aby pasował do różnych sytuacji! Jeśli ktoś ma jakieś sugestie, jak można ulepszyć moduł, prosimy o komentarz :)

W tym module zwracamy obiekt JavaScript. Jeśli chcesz go włączyć JSON po prostu stringify za pomocą JSON.stringify(data).

// Pass in your sequelize JSON object
module.exports = function(json){ 
    var returnedJson = []; // This will be the object we return
    json = JSON.parse(json);


    // Extract the JSON we need 
    if(json[0].hasOwnProperty('dataValues')){
        console.log("HI: " + json[0].dataValues);
        returnedJson = json[0].dataValues; // This must be an INSERT...so dig deeper into the JSON object
    } else {
        console.log(json[0]);
        returnedJson = json[0]; // This is a find...so the JSON exists here
    }

    return returnedJson; // Finally return the json object so it can be used
}

Edytuj 4:

Tak więc istnieje oficjalna metoda sequelize. Zapoznaj się z zaakceptowaną odpowiedzią poniżej.


22
2017-12-25 06:11


pochodzenie


Istnieje "oficjalny" sposób, aby to zrobić, proszę zapoznać się z moją odpowiedzią. - rambossa


Odpowiedzi:


Choć słabo udokumentowane, to istnieje w Sequelize.

Kilka sposobów:

1.  Dla każdej odpowiedzi obiekt które wynikają z zapytania, możesz wyodrębnić tylko żądane dane przez dodanie .get({plain:true}) odpowiedź w następujący sposób:

Item.findOrCreate({...})
      .spread(function(item, created) {
        console.log(item.get({
          plain: true
        })) // logs only the item data, if it was found or created

Upewnij się też, że używasz spread funkcja wywołania zwrotnego dla Twojego typu obietnicy zapytania dynamicznego. Zauważ, że masz dostęp do odpowiedzi boolowskiej, created, co oznacza, czy zostało wykonane zapytanie o tworzenie.

2. Sequelize zapewnia raw opcja. Po prostu dodaj opcję {raw:true} a otrzymasz tylko nieprzetworzone wyniki. To zadziała na tablicy wyników, pierwsza metoda nie powinna, jak get nie będzie funkcją tablicy.


18
2018-01-23 10:26



Niezłe. Przepraszam, że tak późno to zaakceptowałem, zobaczyłem to krótko, potem zapomniałem, że ma odpowiedź. - James111


Jeśli chcesz pracować tylko z wartości instancji Spróbuj zadzwonić get({plain: true}) lub toJSON()

tags.findOrCreate( { 
    where: { tagName: tag }
})
.then(function(tagData){
     console.log(tagData.toJSON());
})

4
2017-12-25 13:27



To chyba nie działa. dostaję [TypeError: undefined is not a function]. Sądzę, że po prostu będę musiał napisać własną funkcję, by wydobyć równinę JSON - James111
@ James111, oh przepraszam, spróbuj użyć bez raw: true parametr w zapytaniu - Rudolf Manusachi
Pamiętaj, aby nie pytać toJSON() na liście, tak jak właśnie. Nie w przypadku pytania, tylko dla kogoś szukającego. - Victor Ivens
Można go użyć z wynikami .findOne () lub pojedynczego obiektu findAll (). Na tablicy funkcja .toJSON () będzie wyświetlać niezdefiniowane - Abdul Vajid


sequelize-values jest modułem npm, który pomaga ci to zrobić. Posiada metody, które z łatwością drukują wartości zarówno na pojedynczym elemencie, jak i na liście wyników (tablica) https://www.npmjs.com/package/sequelize-values


0
2018-06-15 07:12