そのため、データベースの結果を返してもらいたいだけです。現時点では、大量の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が返されるようです。
これを回避する方法はありますか?
わかりましたので、再利用可能な機能に変えることができる回避策を見つけました。しかし、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 })
_
そのため、これを実現する「公式」の続編方法があるとは思わないので、必要な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
}
_
そのため、公式のsequelizeメソッドがあります。以下の受け入れられた回答を参照してください。
文書化は不十分ですが、これは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
は配列の関数ではないため、これは結果の配列で機能しますが、最初の方法では機能しません。
インスタンスの値 のみを使用する場合は、get({plain: true})
またはtoJSON()
を呼び出してください。
tags.findOrCreate( {
where: { tagName: tag }
})
.then(function(tagData){
console.log(tagData.toJSON());
})
更新しました:
つかいます 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'})
})
sequelize-values
は、これを行うのに役立つnpm-moduleです。単一の項目と結果のリスト(配列)の両方に値を簡単に出力するメソッドがあります https://www.npmjs.com/package/sequelize-values