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: '获取服务器详情失败'}); }); });
关键修改点说明
数组映射处理
数据库返回的result是包含RowDataPacket对象的数组,我们用result.map(item => item.serverName)遍历每个对象,提取其中的serverName字段,直接生成你需要的纯字符串数组['server1', 'server2', ...]。修正错误逻辑
原代码中出错时同时调用resolve(null)和res.status(200).json(),会导致后续then块再次发送响应,引发Cannot set headers after they are sent的错误。现在改为出错时reject(err),然后在catch块统一处理错误响应,逻辑更规范。简化Promise结构
因为你只有一个异步查询操作,完全不需要用Promise.all,直接使用单个Promise即可,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Saurabh Aren Bharatiya
相关产品推荐
相关产品推荐

