如何在 res.send() 中获得所需的响应?

How to get desired response in res.send()?

我想做的是从 Db 获取详细信息,当我收到响应时,属性名称不应与 Db 相同,因此我正在使用 for 循环。当我尝试控制它时,我得到了想要的响应,但我得到的是空 array/the 数据库的最后数据。谁能帮帮我?

// ------display all customer group---->
const displayCustomerGroup = async (req,res,next) =>{
    var results = await Group.findAll();
    var newData ={};
    var data = {};
  
 for(var i = 0; i < results.length ; i++){

    for(const [key,value] of Object.entries(results[i].dataValues)){
        newData[key.replace("cg_","")] = value;  
    
    }
    
    console.log(newData)
  }
  res.json({
    status:"success",
    message:"Successfully",
    data:newData 
    })      

}

当您使用 Sequelize 模型时,您可以将选项传递给 findAll() 方法。您正在寻找的选项是 attributes 选项。这使您可以选择要返回的列 - 类似于 SQL 中的 SELECT 语句。 Attributes 应该是与列名称匹配的字符串数组。

例如:

await Group.findAll({
     attributes: ["Id", "Name", "CreateDate"]
})

如果需要,您还可以通过传递一个数组来重命名列,其中每个数组首先是列的名称,其次是列的新名称:

await Group.findAll({
     attributes: [["cg_id","Id"], ["cg_name", "Name"], ["cg_date", "CreateDate"]]
})

在 SQL 中,基本上是这样的:

SELECT cg_id AS Id, cg_Name AS Name, cg_date AS CreateDate
FROM Group

看起来你有两个循环:你有很多结果(你在外循环中迭代),每个结果都有一组许多键值对(你在内部循环中迭代) .内部循环将键值对复制到 newData,但如果下一个结果具有相同的键名,它们将覆盖前一个结果的数据。

相反,您需要使用一个对象数组,并在外循环中逐项填充该列表:

var dataList =[];

for(var i = 0; i < results.length ; i++){
    let dataItem = {};
    for(const [key,value] of Object.entries(results[i].dataValues)){
        dataItem[key.replace("cg_","")] = value;
    }
    dataList.push(dataItem);
}
res.json({
    status:"success",
    message:"Successfully",
    data: dataList
})