Sequelize -如何只返回数据库结果的JSON对象?

blmhpbnm  于 2023-05-30  发布在  其他
关注(0)|答案(6)|浏览(151)

所以我只想返回数据库结果。目前我得到返回一大块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:

所以有一个官方的续集方法。参考下面接受的答案。

4dc9hkyq

4dc9hkyq1#

虽然记录不多,但这确实存在于续集中。
几种方法:

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

还要确保您正在为您的动态查询promise类型使用spread回调函数。注意,您可以访问一个布尔响应created,它表示是否执行了create查询。

**2.**Sequelize提供raw选项。只需添加选项{raw:true},您将只收到原始结果。这将对结果数组起作用,第一个方法不应该,因为get不是数组的函数。

relj7zay

relj7zay2#

如果只想处理示例的值,请尝试调用get({plain: true})toJSON()

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

iyr7buue3#

更新时间:
使用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'})
  })
unhi4e5o

unhi4e5o4#

现在使用async/await语法更容易阅读

module.exports = async function(tagName) {
  const [tag, created] = await Tag.findOrCreate({
    where: {tagName},
    defaults: {tagName}
  });
  return tag.get({plain:true});
}
bgibtngc

bgibtngc5#

sequelize-values是一个npm模块,它可以帮助你做到这一点。它的方法可以轻松地打印单个项目和结果列表(数组)https://www.npmjs.com/package/sequelize-values

guykilcj

guykilcj6#

console.log(JSON.parse(JSON.stringify(await Model.findAll({}))));

相关问题