NodeJS中如何将MySQL的RowDataPacket结果转为字符串用于查询
提取RowDataPacket中的ID并转为逗号分隔字符串用于SQL查询
你需要先从RowDataPacket数组中提取所有id字段,再拼接成逗号分隔的字符串,同时要把第二个SQL查询的条件从=改成IN(因为要匹配多个ID)。以下是具体实现步骤和修正后的代码:
关键处理步骤
- 提取ID:使用
Array.map()遍历查询结果,取出每个对象的id值,再用Array.join(', ')拼接成逗号分隔的字符串。 - 修改SQL条件:将
WHERE userId = ?改为WHERE id IN (?),适配多ID匹配场景。 - 修正空结果判断:
db.query()返回的是数组,即使无数据也是空数组,所以用users.length === 0判断是否有有效结果。
修正后的完整代码
File.getAvatars = async (req, result) => { try { // 查询指定familyid下的所有用户ID const users = await db.query( `SELECT id FROM users WHERE familyid = ?`, [req] // 若req是完整请求对象,建议改为具体字段如req.familyid,原代码写的固定值2可按需保留 ); // 判断是否存在用户数据 if (users.length === 0) { console.log('No users found'); return result(null, new Error('No users found')); } // 提取ID并转为逗号分隔字符串 const userIds = users.map(user => user.id).join(', '); // 根据用户ID集合查询对应的fileName const avatars = await db.query( `SELECT fileName FROM users WHERE id IN (?)`, [userIds] ); // 判断是否存在头像文件数据 if (avatars.length === 0) { console.log('No avatars found'); return result(null, new Error('No avatars found')); } // 示例:获取第一个头像文件的元数据,若需全部可改用Promise.all遍历处理 const metadata = await bucket.file(avatars[0].fileName).getMetadata(); return result(null, metadata); } catch (err) { console.log('Error selecting from AVATARS: ', err); return result(null, err); } };
额外补充
如果需要获取所有用户头像的元数据,可以用Promise.all()批量处理:
const metadataList = await Promise.all( avatars.map(avatar => bucket.file(avatar.fileName).getMetadata()) ); return result(null, metadataList);
内容的提问来源于stack exchange,提问作者alphatango165
相关产品推荐
相关产品推荐

