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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:00:33