База данных DiscordJS не хранит информацию идеально

Я пытаюсь заставить бота Discord создать базу данных, которая в основном является пользовательской картой (строка для каждого пользователя и столбцы для идентификатора, псевдонима, URL-адреса аватара и т. д.), когда он получает команду !getdata.

Я дошел до того, что база данных успешно получает данные, в данном случае имя пользователя и идентификатор пользователя, но отображает все уникальные значения в двух столбцах в виде длинных значений, разделенных запятыми (т. е. столбец имени пользователя отображает «user1, user2, user3 ').

Я уверен, что это по замыслу, но я действительно борюсь с реструктуризацией. Я бы хотел, чтобы он брал все данные из карты объектов (client.users или message.guild.members), но я не могу этого понять.

Другой вариант, который я сейчас пробую, — создать строку для каждого пользователя, а затем заполнить значения, которые я хочу сохранить, но у меня ничего не получается.

Я очень новичок в SQLite (и node/DiscordJS/JS, если на то пошло), поэтому любые советы очень ценятся.

Index.js

const Discord = require('discord.js');
const client = new Discord.Client();
const sql = require('sqlite3');

let db = new sql.Database("users.sqlite", (err) => {
    if (err) {
        console.info('Error connecting to the database', err)
    } else {
        console.info('Database connected.')
    }
})

let token = process.env.CLIENT_TOKEN;
let prefix = process.env.PREFIX ;

client.on('ready', () => {
    console.info(`Logged in as ${client.user.tag}!`);
    db.run(`CREATE TABLE IF NOT EXISTS users(username TEXT, id TEXT)`);
})

client.on('message', function(message) {

    if (!message.content.startsWith(prefix));

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'getdata') {
        let username = message.guild.members.map(m=>m.user.username);
        let userid = message.guild.members.map(m=>m.user.id);
        db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [`${username}`,`${userid}`]);
        return message.channel.send(`User database updated.`);
    }
});

client.login(token);

Если вам интересно форматирование или способ написания, ответ будет двояким:

  1. я новичок в этом
  2. Это был единственный способ заставить значения в базе данных возвращать что-то отличное от нуля.

Заранее спасибо,

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 388
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, добро пожаловать на сайт.

Я надеюсь, что смогу пролить здесь немного света, не углубляясь в рефакторинг вашего кода и не заставляя вас менять что-то серьезное.

Мне бросается в глаза одна вещь: в Зачем вы сохраняете массив вместо одного значения.

let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);

Вызов .map возвращает массив, а не одно значение.

Каждый пользователь, выдающий команду, является частью объекта сообщения. Если я правильно помню, вы бы хотели, чтобы это было что-то вроде...

(упрощенная версия)

const { username, id } = message.member.user;
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [username, id]);
// ...

Пользовательскую документацию можно найти здесь

Редактировать:

Если вы хотите создать базу данных для всех пользователей в этой одной команде, вы можете сделать что-то вроде следующего с массовой вставкой... (быстро и грязно)

db.serialize(() => {
  db.run('BEGIN TRANSACTION;');
  // execute inserts in transaction
  for (const m of message.guild.members) {
    db.run('INSERT OR REPLACE INTO users(username, id) VALUES(?,?);', [m.user.username, m.user.id]);
  }
  // commit all inserts :)
  db.run('COMMIT;')
});

message.channel.send('User database updated.');

Документация по управлению потоком

Надеюсь, это укажет вам правильное направление :)

message.member.user можно сократить до message.author.
slothiful 30.05.2019 01:40

Большое вам спасибо, это определенно сработало для извлечения моих собственных пользовательских данных и предоставления им независимой строки в базе данных, но что, если я пытаюсь получить информацию обо всех пользователях в гильдии? Это то, что я пытался получить, извлекая массив, который извлекает всю информацию для всех пользователей, но группирует ее в одном столбце со значениями, разделенными запятыми. Есть ли способ построить базу данных для каждого члена гильдии?

edgetechnician 30.05.2019 03:49

@edgetechnician я обновил ответ сценарием массовой вставки для создания всех пользователей одной командой :)

technicallyjosh 02.06.2019 20:24

это круто! Спасибо. все еще получаю ошибки компиляции, но я вижу, к чему вы клоните. Я поиграю и опубликую, как это происходит, но это определенно похоже на то, что мне нужно. Большое спасибо!

edgetechnician 03.06.2019 21:45

Другие вопросы по теме