【问题标题】:Node JavaScript express JavaScript format data get from the sequlize queryNode JavaScript express 从 sequelize 查询中获取的 JavaScript 格式数据
【发布时间】:2019-02-28 07:31:45
【问题描述】:

我在 express JavaScript 框架中使用 sequlize。

const data = await db.Tour.findAll();
res.status(200).json(data)

如果我这样做,我可以像这样在前端 vue JavaScript spa 中很好地检索数据

{
    tour_name:"Bali",
    activities:[
        {name:"Swimming"},
        {name:"Beach vollyball"},
    ]
}

上面一个是为前端检索数据。

如果我需要在发送数据之前获取数据并在控制器中进行一些更改,我会 raw: true 然后我可以在我的控制器中获得相同的输出。但问题是 raw: true 与 加入,因此从控制器获取数据并对其进行一些更改非常困难。 我必须访问这么多嵌套对象才能找到我想要的数据。有没有更聪明的方法(应该有)来获得上述格式 从控制器而不使用 raw: true

我希望一定有一种很好的方法可以将该数据对象传递给某些东西并转换为格式。 我如何做到这一点?

【问题讨论】:

  • 不确定您需要raw 做什么:您不能按原样更改控制器中的data 吗?也许展示一个更完整的例子,包括你所有的连接和嵌套? (如果你展示的是你在客户端得到的,那应该和你传递给res.json的没什么区别吧?)
  • 我可以更改数据,但我需要像这样深入一些东西。dataValues。我想要一个简单的表格。当然是因为这个样本数据。据我所知,我们可以将raw:true 用于复杂的连接?
  • 我不知道raw 的限制,但是您始终可以使用中间变量来存储嵌套对象的路径(JS 中的所有内容都是 references),所以代码看起来不太冗长。无论如何,如果你的数据有很多层次的深度,如果你想改变它,你需要在某个时候告诉 JS 数据的路径。

标签: javascript node.js express sequelize.js


【解决方案1】:

在下面的代码中,我必须检索商店产品图像及其 ID 以及其他一些数据,例如评分、计数等。

In below code I had to retrieve a shop products images and its ids.


exports.filterShopListings = async (data) => {

    return Db.sequelize.query("SELECT productImages, S.shopId, S.currency, S.mainImage, S.mainImageThumb, S.coverImage, S.coverImageThumb, S.name, S.location, S.approved, S.locationLatitude, CONCAT('"+process.env.QR_URL+"',S.qrCode) as qrCode, S.locationLongitude, COALESCE(productCount,0) as productCount, COALESCE(ratingCount,0) as ratingCount, COALESCE(ROUND(UR.ratingAvg,1) ,0) as ratings, COALESCE(shopFollowing,0) as followingCount FROM shops as S JOIN users U ON (U.userId=S.userId AND U.blocked='0') LEFT JOIN ( SELECT COUNT(*) as productCount, shopId, GROUP_CONCAT(mainImageThumb,'--',shopProductId) as productImages FROM shopProducts WHERE shopProducts.deleted='0' AND shopProducts.blocked='0' GROUP BY shopId)  SP ON (SP.shopId=S.shopId) LEFT JOIN ( SELECT COUNT(*) as ratingCount, AVG(ratings) as ratingAvg, shopId FROM userRatings WHERE userRatings.blocked='0' AND userRatings.deleted='0' GROUP BY shopId ) UR ON (UR.shopId=S.shopId) LEFT JOIN ( SELECT COUNT(*) as shopFollowing, shopId FROM shopFollowings GROUP BY shopId) SF ON (SF.shopId=S.shopId) WHERE "+data.whereString+" HAVING "+data.havingString+" ORDER BY "+data.orderingParam+" "+data.orderingSort+" LIMIT "+data.skip+", "+data.take+" ",{ type: Sequelize.QueryTypes.SELECT})
        .then( (shops) => {

            shops = JSON.parse(JSON.stringify(shops));

            shops.forEach(  (shop) => {

                //shop.productImagesTemp  = shop.productImages;
                shop.productImages = shopImagesFunc(shop.productImages);

            });

            return shops;

        });

};

还有 shopImagesFunc 代码 -

    var shopImagesFunc = (productImages) => {

    if(productImages ==null)
        return [];

    var images = (productImages.split(",").filter(Boolean));

    var newImages = [];
    images.forEach(image => {

        let temp = image.split("--").filter(Boolean);

        newImages.push({
            shopProductId: parseInt(temp[1]),
            mainImage: temp[0],
        });

    });

    return newImages;

};

SQL 查询有点复杂,但创建一个通用函数来格式化为所需的输出会非常有用。

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 2014-06-07
    • 2017-06-24
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多