Node.js机器人SQLite查询报错:rows.forEach不是函数
TypeError: rows.forEach is not a function 问题排查与修复
问题场景
我创建了一个staty命令,用于从SQLite数据库中查询并展示用户数据。但运行机器人输入该命令时,出现错误:TypeError: rows.forEach is not a function。我的代码如下:
const fetch = require("node-fetch"); const EmbedUtil = require("../../utils/EmbedUtil"); const BaseCommand = require("../BaseCommand"); const { MessageEmbed } = require("discord.js"); const config = require("../../data/config.json"); const MessageUtil = require("../../utils/MessageUtil"); const sqlite3 = require("sqlite3").verbose(); class StatsCommand extends BaseCommand { constructor() { super("staty"); } execute(bot, msg, args) { if (args.length === 0) { const embed = EmbedUtil.createEmbed("Blad", [ `Poprawne użycie: ${config.prefix}staty (nick)`, ]); MessageUtil.replyMessageAndDelete(embed, msg, 7); return; } let db = new sqlite3.Database("db/DataBase.db"); db.get( "SELECT * FROM `users` WHERE nick = ?", [args[0]], (err, rows, fields) => { if (err) { msg.reply("Podany gracz nie istnieje!"); return; } rows.forEach((nick, kills, points, deaths) => { const embed = EmbedUtil.createEmbed( "**STATYSTYKI**", `**Gracz:** ${player} \n**Zabojstwa:** ${kills} \n**Smierci:** ${deaths} \n**Punkty:** ${points} \n**Gildia:** ${guild}` ); msg.channel.send(embed); return; }); } ); } } module.exports = StatsCommand;
问题原因与修复方案
1. 核心错误:db.get()返回的不是数组
sqlite3中的db.get()方法专门用于查询单条匹配记录,它的回调函数第二个参数是单个对象(比如row),而不是数组。你试图对单个对象调用数组的forEach方法,自然会报错。
如果需求是查询多条记录,改用db.all()方法;如果确定只查单条,直接使用返回的对象即可,不需要遍历。
2. 其他代码问题
- 回调参数错误:
db.get()的回调签名是(err, row),不存在fields参数。 - forEach参数误用:即使是数组的
forEach,回调参数顺序是(元素, 索引, 原数组),你写的(nick, kills, points, deaths)完全不符合逻辑,应该直接从查询返回的对象中取字段。 - 未定义变量:代码中的
player、guild没有声明,应该用查询结果对象的属性,比如row.nick、row.guild。
修正后的代码
const fetch = require("node-fetch"); const EmbedUtil = require("../../utils/EmbedUtil"); const BaseCommand = require("../BaseCommand"); const { MessageEmbed } = require("discord.js"); const config = require("../../data/config.json"); const MessageUtil = require("../../utils/MessageUtil"); const sqlite3 = require("sqlite3").verbose(); class StatsCommand extends BaseCommand { constructor() { super("staty"); } execute(bot, msg, args) { if (args.length === 0) { const embed = EmbedUtil.createEmbed("Blad", [ `Poprawne użycie: ${config.prefix}staty (nick)`, ]); MessageUtil.replyMessageAndDelete(embed, msg, 7); return; } let db = new sqlite3.Database("db/DataBase.db"); db.get( "SELECT * FROM `users` WHERE nick = ?", [args[0]], (err, row) => { if (err || !row) { // 增加判断,确保找到记录 msg.reply("Podany gracz nie istnieje!"); return; } // 直接使用单条记录对象,无需遍历 const embed = EmbedUtil.createEmbed( "**STATYSTYKI**", `**Gracz:** ${row.nick} \n**Zabojstwa:** ${row.kills} \n**Smierci:** ${row.deaths} \n**Punkty:** ${row.points} \n**Gildia:** ${row.guild}` ); msg.channel.send(embed); } ); } } module.exports = StatsCommand;
内容的提问来源于stack exchange,提问作者Matiq
相关产品推荐
相关产品推荐

