You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中REST API数据库查询返回纯字符串数组的实现方案

解决方案:将查询结果转为纯字符串数组

嘿,这个需求很容易实现,咱们只需要对数据库返回的RowDataPacket数组做一次映射处理,就能提取出纯字符串数组。另外我注意到你原代码里有个潜在的错误处理问题,一起帮你修正了,避免出现重复响应的bug。

修改后的完整代码

app.post("/getServerDetails", function(req, res){ 
  var id = req.body.id; 
  if (con == null) con = db.openCon(con); 
  
  // 单个异步操作无需用Promise.all,简化结构
  new Promise((resolve, reject)=>{
    con.query("select serverName from servers where id = ?", [id], function(err, result){ 
      if(err){
        // 出错时直接reject,不在此发送响应
        reject(err);
        return;
      }
      // 核心:将RowDataPacket数组映射为纯字符串数组
      const serverNames = result.map(item => item.serverName);
      resolve(serverNames); 
    }); 
  })
  .then((serverNames)=>{
    res.status(200).json(serverNames); 
  })
  .catch((err) => {
    // 统一在catch块处理错误响应,避免重复发送
    console.error('查询服务器信息出错:', err);
    res.status(500).json({success: 0, message: '获取服务器详情失败'});
  }); 
});

关键修改点说明

  1. 数组映射处理
    数据库返回的result是包含RowDataPacket对象的数组,我们用result.map(item => item.serverName)遍历每个对象,提取其中的serverName字段,直接生成你需要的纯字符串数组['server1', 'server2', ...]。

  2. 修正错误逻辑
    原代码中出错时同时调用resolve(null)和res.status(200).json(),会导致后续then块再次发送响应,引发Cannot set headers after they are sent的错误。现在改为出错时reject(err),然后在catch块统一处理错误响应,逻辑更规范。

  3. 简化Promise结构
    因为你只有一个异步查询操作,完全不需要用Promise.all,直接使用单个Promise即可,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Saurabh Aren Bharatiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:18:44