Discord.js 在消息中显示 sqlite 行?

Discord.js Displaying sqlite rows in message?

我是 discord.js 的新手,在消息中 displaying/sorting 来自 sqlite 数据库的数据时遇到问题。我目前正在更新每个用户行,因为他们在服务器中发送了一条消息,工作正常。但是,我想要使用数据库中包含的数据进行 'leaderboard' 排序。

这是我正在尝试的改进版本:

var Discord = require('discord.js');
var bot = new Discord.Client();
var moment = require('moment');
var Roll = require('roll'),
const sql = require("sqlite");
sql.open("userData.sqlite");

bot.on('message', message => {

var prefix = config.prefix;
var sender = message.author;
var msg = message.content.toUpperCase();

sql.get(`SELECT * FROM userData WHERE userId ="${message.author.id}"`).then(row => {
        if (!row) {
            sql.run("INSERT INTO userData (userId, username, level, money, time) VALUES (?, ?, ?, ?, ?)", [message.author.id, sender.username, 0, 0, 0]);
        }
    }).catch(() => {
        console.error;
        sql.run("CREATE TABLE IF NOT EXISTS userData (userId TEXT, username TEXT, level INTEGER, money INTEGER, time INTEGER)").then(() => {
            sql.run("INSERT INTO userData (userId, username, level, money, time) VALUES (?, ?, ?, ?, ?)", [message.author.id, sender.username, 0, 0, 0]);
        });
    });
});

读取数据并在消息中发送内容的命令工作正常,例如:

if (msg === prefix + 'MONEY') {
        sql.get(`SELECT * FROM userData WHERE userId ="${sender.id}"`).then(row => {
            message.channel.send(`You have: $${row.money}`)
        })
    }

但是,我对 sqlite 不是很了解,sorting/displaying 上的文档似乎对我不起作用。我只是想看看有多少用户以及他们有多少钱(用于迷你游戏):

if (msg === prefix + 'LEADERBOARD') {
        sql.get(`SELECT username,money FROM userData ORDER BY username`).then(rows => { 
                message.channel.send(rows); 
        })
    } 

然而,这个returns:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): DiscordAPIError: Cannot send an empty message. 如有任何帮助或建议,我们将不胜感激!

const Discord = require('discord.js');
const bot = new Discord.Client();
const sql = require("sqlite");
sql.open("userData.sqlite");

bot.on('ready', () => {
console.log('I\'m Ready!');
});

bot.on('message', async message => {
 const data = await sql.get(/*do something*/);
 if (!data){
   // do something
  return;
 }
 // else - do something
 // for example
  return message.channel.send(`${data.username} hi!`);
});

bot.login(/*super-secret-accsess-token*/);

你必须使用 async/await。

这个问题的答案似乎根本没有使用异步。我只是误用了 sqlite,需要将 sql.get 更改为 sql.all(sql.get 只读取第一行,如果不设置限制,sql.all 会读取所有行)并且能够控制台轻松记录结果。

cannot send empty message 的问题是 discord 无法在一条消息中发送多行数据而不得不用新行迭代的结果。为此,我使用了 'rows.forEach' 并且效果很好。 (在嵌入中看起来比发送多条消息要好得多)

对于遇到此问题的任何其他人,这是对我有用的解决方案:

if (msg === prefix + 'LEADERBOARD') {
    sql.all('SELECT username,money FROM userData ORDER BY money DESC').then(rows => {
        rows.forEach(function (row) {  
            console.log(row.username, row.money);
            message.channel.send(row.username + ' Has: $' + row.money);  
        }) 
    })
}

从那以后,我找到了一种更好的方法来执行此操作,即输出一个包含 sqlite 数据库中已排序条目数的嵌入。这就是我如何让 +leaderboard 在不发送单独消息的情况下显示数据库中的前 3 名用户。

if (msg === prefix + 'LEADERBOARD') {
    sql.all('SELECT username,money FROM userdata ORDER BY money DESC LIMIT 3').then(rows => {
        var leaders = '';
        rows.forEach(function (row) {
            descr += `${row.username}: $${row.money}\n`
        })
        message.channel.send({
            embed: {
                title: "Leaderboard Top 3",
                color: 3447003,
                description: `${leaders}`
            }
        });
    })
}