Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   js цикл с постоянным вносом сообщений в таблицу (https://javascript.ru/forum/node-js-io-js/74723-js-cikl-s-postoyannym-vnosom-soobshhenijj-v-tablicu.html)

SorryHanzoMain 03.08.2018 09:17

js цикл с постоянным вносом сообщений в таблицу
 
Вопрос заключается в том, что у меня есть код.
client.on("message", async message => { 
    var quest = config_quest.prefix
        for (var i = 0; i < quest + forbidenMessage; i++) {
            if (message.content.includes(forbidenMessage[i]))
        
            if(!forbidenMessage[i]){

            }else{sql.run('INSERT INTO вопросы (вопрос) VALUES (?)', [forbidenMessage[i]])}
              break;
            }
        })

и в нём как видно есть цикл. Проблема в том, что я не знаю как обозначить forbidenMessage. По сути это любое сообщение в чате. То есть если кто-то написал ?javascript, то это и есть quest + forbidenMessage. Может вы знаете как по другому сделать или как обозначить forbidenMessage. Благодарен за помощь.

Nexus 03.08.2018 09:27

Я совсем не понял вопроса (да и nodejs не знаю), однако если нет веской причины не вставлять в бд все записи сразу, то лучше именно так и поступить.
Еще у вас код какой-то странный.
Если forbidenMessage - array, тогда что это может значить?
i < quest + forbidenMessage;

Почему "запрещенноеСообщение" вносится в БД?
Почему условие такое странное?

SorryHanzoMain 03.08.2018 10:42

Nexus
i < quest + forbidenMessage;

forbidenMessage- это сообщение. Если оно больше чем ноль то оно суммируется с i(равное нулю), а поскольку forbidenMessage + 0, получается forbidenMessage. Сообщение уходящее в таблицу. Вот почему <. Иначе выйдет, что forbidenMessage должно быть меньше нуля, и ничего не выйдет. Я сам тоже новичок и могу ошибаться. И, что такое БД(я так понимаю это i)?

Nexus 03.08.2018 10:51

SorryHanzoMain,
Цитата:

Сообщение от SorryHanzoMain
forbidenMessage- это сообщение. Если оно больше чем ноль то оно суммируется с i(равное нулю), а поскольку forbidenMessage + 0, получается forbidenMessage.

У вас в коде отсутствует инициализация этой переменной, значит она должна быть инициализирована до обработчика "сообщений". Она инициализируется?
Допустим да. Какой тип данных хранится в этой переменной?
Если число, то значение переменной "quest" обязательно должно быть числом и у вас в коде ошибка:
forbidenMessage[i]
к числу неприменимо. Так можно написать только если forbidenMessage является массивом либо строкой.
Если "forbidenMessage" является массивом, то строка
i < quest + forbidenMessage;

неверна, т.к. условие никогда не выполнится.
Если "forbidenMessage" является строкой, то снова ошибка: цикл не будет выполнен ни разу, т.к. число не больше, не меньше и не равно непустой строке.

Audaxviator 03.08.2018 11:08

О-хо-хо...
Ну вот есть строчка
client.on("message", async message => {

Я не знаю, зачем там async - ну ладно, пусть будет async.
В переменную message (которая сразу после async и на месте которой может быть, конечно, любое имя, хоть матерное слово) передано сообщение.
Теоретически можно догадаться (но это не точно), что это socket.io, и видимо (если это не старая его версия), в эту переменную передан объект - "хеш" с ключами и значениями.
Так что это за объект? Что за сообщение клиент получил?
Как только вы догадаетесь, как тут этот объект продемонстрировать (хотя я предполагаю, что вы его сами не видели) - так получите от кого-нибудь вразумительный ответ на вразумительный вопрос.

SorryHanzoMain 03.08.2018 11:14

Nexus
Я так понимаю, что forbidenMessage- это строка(текст), quest-это префикс "?". Он стоит перед сообщением и на него реагируют в первую очередь. Да этот код он для массива, но он очень похож на то, что должно быть. Как должен выглядеть этот код? Ещё всё дело в том, что это бот для дискорда. И там любое сообщение к боту это команда. Quest это активатор всего цикла.

SorryHanzoMain 03.08.2018 11:24

Audaxviator
client.on("message", async message => {

Как я понимаю message содержит в себе токен(адрес бота на сервере дискорд). Хотя я в этом не уверен.

Nexus 03.08.2018 11:25

SorryHanzoMain, а как сообщение попало в "forbidenMessage"?
По идее оно должно быть либо в аргументе "message" (судя по строке 4 это не так), либо как-то из него извлекаться.
Чтобы реализовать задуманное, вам нужно сначала получить список сообщений (разве не должно оно быть единственным?), удалить из списка сообщения, которые не начинаются на префикс (знак вопроса), проверить наличие сообщений в массиве. Если сообщения есть есть, то вставить их в бд.
Если в таблице "вопросы" поле "вопрос" имеет уникальный ключ, то стоит либо при фильтрации сообщений проверять их на уникальность, либо изменить запроса на insert ignore либо добавить on duplicate key update.

Nexus 03.08.2018 11:33

Так работает?
//пример смотрел тут: [url]https://github.com/eslachance/bot-guide[/url]
client.on("message",  request => {
  const REQUIRED_PREFIX='?';
  const message=request.content.toString().trim();
  
  if(message.substr(0,1)!==REQUIRED_PREFIX)
    return request.reply('Bad request'), false;
  
  sql.run('INSERT INTO вопросы (вопрос) VALUES (?)',[message]);
  
  
  return request.reply('Saved successfully'), true;
});

Audaxviator 03.08.2018 11:36

Так надо посмотреть - чтоб быть хоть в чём-то уверенным.
Потому что этот объект много чего содержит - текст вопроса в том числе.

SorryHanzoMain 03.08.2018 11:39

Нет ключа у него нет. Но у меня нет списка сообщений. Они просто приходят в чат и всё и как их внести в массив я не знаю. В message попадают все сообщения и я не знаю как и почему. Я пытался поставить message в этот код, тогда получилось бы, что message-это сообщение(любое), и если оно в месте с префиксом, то его надо занести его в таблицу, но не вышло message перестаёт иметь определение и не находится.

Audaxviator 03.08.2018 11:44

Надо напейсать так:
client.on('message', m => {
  console.log(m);
};

и поглядеть, чего напишет.

SorryHanzoMain 03.08.2018 11:45

Nexus
Так работает?
Да работает. Спасибо правда бот боту четыре раза отправляет Bad request, и можно объяснить мне, что я сделал не так?

Nexus 03.08.2018 11:47

Цитата:

Сообщение от SorryHanzoMain
что я сделал не так

Гадать можно долго.

SorryHanzoMain 03.08.2018 11:49

Nexus
if(message.substr(0,1)!==REQUIRED_PREFIX)
    return request.reply('Bad request'), false;
});
[/quote]
А эту часть можно заменить на
if(message.substr(0,1)!==REQUIRED_PREFIX)
    return console.log('Bad request'), false;

Nexus 03.08.2018 11:53

SorryHanzoMain, это нельзя считать исправлением ошибки (если ошибка вообще существует).
Можно и так написать:
if(message.substr(0,1)!==REQUIRED_PREFIX)
    return false;

Вот только ожидает ли объект request, что скрипт что-то да ответит?
Запрос без ответа - такое себе client-server взаимодействие.

upd. а еще можно void возвращать, тогда в коде выше false удаляется, а в конце обработчика сообщения удаляется "return ", запятая и "true".

SorryHanzoMain 03.08.2018 12:00

Nexus спасибо большое за помощь! Я думал, что ру сообщество совсем в discord.js мне не поможет.


Часовой пояс GMT +3, время: 22:25.