web-dev-qa-db-ja.com

Sequelize-データベース結果のJSONオブジェクトのみを返すにはどうすればよいですか?

そのため、データベースの結果を返してもらいたいだけです。現時点では、大量のJSONデータが返されています(以下を参照)。

ただし、必要なのは[dataValues]属性のみです。 JSONのこのビットを使用して取得する必要はありません:_tagData[0].dataValues.tagId_。

気付いたのは、DOES N'T CREATEを見つけて、データベース結果のJSONを返しますが、DOESN 'T FINDを作成し、不要なJSON blobを返します(下のように)これを回避する方法はありますか?

_[ { 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 ]
_

上記のような大きなblobを取得する代わりに、RAW jsonの結果のみが必要です(以下を参照)。

_{ 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) },
_

次のjavascriptを使用しました。 _raw: true_を追加しようとしましたが、機能しませんでしたか?

_    // 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);
        }
    });

}
_

編集:

だから私は少し調べましたが、JSONが作成されていないときにのみ、大きなSequelize blobが返されるようです。

これを回避する方法はありますか?

編集2:

わかりましたので、再利用可能な機能に変えることができる回避策を見つけました。しかし、Sequelizeに何かが組み込まれている場合は、それを使用したいと思います。

_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 })
_

編集3:

そのため、これを実現する「公式」の続編方法があるとは思わないので、必要なJSONデータを返すカスタムモジュールを作成しました。このモジュールは、さまざまな状況に合わせてカスタマイズおよび拡張できます!モジュールの改善方法について提案がある場合は、お気軽にコメントしてください:)

このモジュールでは、Javascriptオブジェクトを返します。 JSONに変換する場合は、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
}
_

編集4:

そのため、公式のsequelizeメソッドがあります。以下の受け入れられた回答を参照してください。

27
James111

文書化は不十分ですが、これはSequelizeにも存在します。

カップルの方法:

1。応答の場合オブジェクトクエリの結果、.get({plain:true})を応答に追加することで、必要なデータのみを抽出できます。

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

また、動的クエリプロミスのタイプにspreadコールバック関数を使用していることを確認してください。また、作成クエリが実行されたかどうかを示すブール応答createdにアクセスできることに注意してください。

2。 Sequelizeはrawオプションを提供します。オプション{raw:true}を追加するだけで、生の結果のみを受け取ります。 getは配列の関数ではないため、これは結果の配列で機能しますが、最初の方法では機能しません。

25
rambossa

インスタンスの値 のみを使用する場合は、get({plain: true})またはtoJSON()を呼び出してください。

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

更新しました:

つかいます data.dataValues

db.Message.create({
    userID: req.user.user_id,
    conversationID: conversationID,
    content: req.body.content,
    seen: false
  })
  .then(data => {
    res.json({'status': 'success', 'data': data.dataValues})
  })
  .catch(function (err) {
    res.json({'status': 'error'})
  })
4
KitKit

sequelize-valuesは、これを行うのに役立つnpm-moduleです。単一の項目と結果のリスト(配列)の両方に値を簡単に出力するメソッドがあります https://www.npmjs.com/package/sequelize-values

0
Abdul Vajid