所以我只想返回数据库结果。目前我得到返回一大块JSON数据(如下所示):
但我只需要[dataValues]属性。我不想使用JSON
的这一段来检索它:tagData[0].dataValues.tagId
。
我刚刚注意到:当它找到并DOESN '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);
}
});
}
编辑:
所以我调查了一下,似乎只有在Sequelize
创建而不是查找时才会返回大的JSON
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
}
编辑4:
所以有一个官方的续集方法。参考下面接受的答案。
6条答案
按热度按时间4dc9hkyq1#
虽然记录不多,但这确实存在于续集中。
几种方法:
1.对于查询得到的任何响应对象,您可以只提取您想要的数据,方法是在响应后面追加
.get({plain:true})
,如下所示:还要确保您正在为您的动态查询promise类型使用
spread
回调函数。注意,您可以访问一个布尔响应created
,它表示是否执行了create查询。**2.**Sequelize提供
raw
选项。只需添加选项{raw:true}
,您将只收到原始结果。这将对结果数组起作用,第一个方法不应该,因为get
不是数组的函数。relj7zay2#
如果只想处理示例的值,请尝试调用
get({plain: true})
或toJSON()
iyr7buue3#
更新时间:
使用
data.dataValues
unhi4e5o4#
现在使用
async/await
语法更容易阅读bgibtngc5#
sequelize-values
是一个npm模块,它可以帮助你做到这一点。它的方法可以轻松地打印单个项目和结果列表(数组)https://www.npmjs.com/package/sequelize-valuesguykilcj6#