Форум программистов, компьютерный форум, киберфорум
JavaScript: Node.js
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
1

CallBack функция работает не корректно

15.01.2017, 23:18. Просмотров 499. Ответов 14
Метки нет (Все метки)


Иными словами я не могу понять, почему при отсутствии данных в базе выполнение просто подвисает. Нет никаких ошибок, в консоле лог не прописывается, а страница подвисает, возвращая что-то вроде "нет доступа к странице" или "страница была не найдена"

Вот сама операция и её колбэк:
Javascript
1
2
3
4
5
6
7
8
9
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (!err) {
          res.send("incorect login, write other login");
        } else {
          console.log(err);
        }
      });
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2017, 23:18
Ответы с готовыми решениями:

Метод класса не работает как callback-функция
Всем привет! Помогите разобраться с синтаксисом. Есть gui-прога, в которой содержится функция...

Функция корректно работает в Delphi 7 и не неверно работает в RAD Studio 10
Переписываю свою программу с Delphi 7 под RAD Studio 10. Столкнулся с проблемой - функция в...

Не корректно работает функция
Добрый день, вот сама функция: #include <stdio.h> void main(void) { int nl = 0; int c = 0;...

Не корректно работает функция
package com.company; import java.lang.String; import java.util.Random; class Main { ...

14
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
15.01.2017, 23:39 2
Да. Если ошибка, то он должен вывести в консоль что-то, но соединение с браузером становится подвисшим. Его всегда нужно закрывать (отправлять что-то, ну или убивать на крайняк).
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
15.01.2017, 23:46  [ТС] 3
Я хочу сделать так. Если логина в базе нет, то тогда нужно добавить его в бд. Я это пытался сделать в колбэке, но из-за того, как вы сказали, что состояние становится подвисшим, это сделать не удаётся.

Я пытался отправить простое предложение (res.send ...), но из-за того, что совпадение в данных бд нет, он и этого не делает.

Как мне поступить, чтобы обойти это дело?
0
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
16.01.2017, 00:20 4
Вообще-то колбек у вас относительно правильный. Только синтаксис используется обычно другой.
У меня вот уже давно всё на промисах построено. Но стандартный синтаксис колбеков таков:
Javascript
1
2
3
4
5
6
7
function(error, data){
    // обрабатываем ошибку
    if (error)
        return Handle(error);
 
    // делаем что-нибудь с данными.
}
По сути ваш можно написать вот так:
Javascript
1
2
3
4
5
6
7
8
9
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (err) {
          return res.status(401).send("incorect login, write other login");
 
        // тут уже можно что-либо делать. А потом, когда всё сделали (в вашем случае добавили логин в бд) тогда уже возвращаем юзеру другой ответ.
        // пока мы ничего не сделали не стоит просто так отправлять ответа, тут уже как со словами, отправил и не вернёшь. Поэтому всегда всё отправляется в последний момент, а ошибки всегда сразу прекращают выполнение метода и сразу возвращают юзеру данные об ошибке
      });
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
16.01.2017, 00:40  [ТС] 5
Сделал как вы сказали:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (!err) {
          return res.status(401).send("write other login");
        }
        if (req.body.password === req.body.repeat_password) {
          db.run("INSERT INTO users(login, password) VALUES($login, $password)", {
            $login: req.body.login,
            $password: req.body.password
          }, function(err) {
            if (err) {
              console.log(err);
            }
          });
          return res.render("pages/index");
        }
      });
Подвисание продолжается. Похоже я что-то не улавливаю
0
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
16.01.2017, 00:45 6
Ага, если он не имеет ошибок выполнения запроса и если у него разные пароли приходят, тогда ему реально нечего делать. Пусть тогда ошибку выкидывает.
Вообще ещё подвисания могут быть из-за долгого конекта к бд.

Добавлено через 2 минуты
А ещё интересно получается, что у вас вставляется пользователь, а вы уже отдали страницу, что всё хорошо. А вдруг он не вставился? Такое может быть. Короче говоря, вы не до конца понимаете как работают колбеки вообще и не до конца понимаете их смысл. Я постараюсь найти в своих постах пример, вроде я его кому-то уже рассказывал. Если не найду, то на пальцах объясню.
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
16.01.2017, 01:05  [ТС] 7
Мысль понял, сделал так:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (!err) {
          return res.status(401).send("write other login");
        }
        if (req.body.password === req.body.repeat_password) {
          db.run("INSERT INTO users(login, password) VALUES($login, $password)", {
            $login: req.body.login,
            $password: req.body.password
          }, function(err) {
            if (err) {
              return console.log(err);
            } else (!err) {
              return console.log("success!");
            }
          });
          return res.render("pages/index");
        } else {
          return res.send("password != repeat password");
        }
      });
Вроде все случаи рассмотрел, всё равно подвисает.

Конектится с бд быстро
0
Эксперт PHP
932 / 690 / 235
Регистрация: 01.02.2015
Сообщений: 1,848
16.01.2017, 01:17 8
не очень мне нравится db.each
х.з. как это работает
я бы вам посоветовал не пилить свою авторизацию, а использовать Passport
и не знаю с каким плагином вы работаете для связки с базой, но самое крутое решение было бы Sequelize
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
16.01.2017, 01:19  [ТС] 9
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
я бы вам посоветовал не пилить свою авторизацию, а использовать Passport
и не знаю с каким плагином вы работаете для связки с базой, но самое крутое решение было бы Sequelize
Я использую плагин sqlite3 для работы с базами SQLite.

В данный момент моя тестовая работа почти закончена, нет только регистрации и авторизации и для пользователей.
Так что мне нужно узнать, как заставить работать это, чем переделывать проект под другой плагин.
0
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
16.01.2017, 01:47 10
dex1cre, у вас код невалидный. Завтра покажу, как надо) А может Фёдор покажет, если я не успею)
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
16.01.2017, 14:53  [ТС] 11
Буду надеяться и ждать
0
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
16.01.2017, 22:45 12
Ладно. Начнём с понятия. Вот представьте себе, что у вас есть кофеварка. Вы взяли и прикрутили к кофеварке кнопку. Ради удобства, чтобы она сразу делала вам кофе, пока вы разуваетесь в коридоре. А теперь в этой же вселенной с кофеваркой мы пригласим домой друга. Но, скажем ему: "приезжай с чем-нибудь вкусненьким к чаю или кофе. Когда приедешь, там на стенке в коридоре кнопка - нажмёшь и тебе приготовиться кофе."
Когда вы приходите домой у вас на столе уже стоит какой-нибудь тортик, кружечка кофе, и друг.
Теперь разберём по действиям. Когда вы позвонили другу и дали ему инструкции, вы объявили колбек. Когда друг приехал и нажал на кнопку в коридоре, он выполнил колбек. Если бы друг не приехал, то он бы не нажал.
Вообще, думаю пример с кодовым замком в подъезде был бы проще, но суть та же. Когда что-то встречается на пути, или что-то происходит, то программа может действовать по заранее описанному алгоритму.


Тк вот, у вас происходит 2 асинхронные операции. Выполняются они должны последовательно, а не параллельно. Соответственно должно быть 2 колбека.
Будет выглядеть этот код примерно так:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (err)
          return res.status(401).send("write other login");
 
        if (req.body.password === req.body.repeat_password) {
          db.run("INSERT INTO users(login, password) VALUES($login, $password)", {
            $login: req.body.login,
            $password: req.body.password
          }, function(err) {
            if (err) {
              return console.log(err);
         
            return res.render("pages/index");
          });
        } else
          return res.send("password != repeat password");
 
      });
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
18.01.2017, 15:20  [ТС] 13
Я это всё понимаю.
Просто реализовать не вышло.

Однако ваше решение всё равно не работает. Подвисания продолжаются

Добавлено через 40 минут
И ваш код тоже немного не валидный

Добавлено через 16 секунд
И ваш код тоже немного не валидный
0
Ренегат
Эксперт HTML/CSS
1735 / 1080 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
18.01.2017, 20:12 14
Цитата Сообщение от dex1cre Посмотреть сообщение
И ваш код тоже немного не валидный
Да, скобочку забыл убрать...
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
db.each("SELECT * FROM users WHERE login=$login", {
        $login: req.body.login
      }, function(err, row) {
        if (err)
          return res.status(401).send("write other login");
 
        if (req.body.password === req.body.repeat_password) {
          db.run("INSERT INTO users(login, password) VALUES($login, $password)", {
            $login: req.body.login,
            $password: req.body.password
          }, function(err) {
            if (err)
              return console.log(err);
         
            return res.render("pages/index");
          });
        } else
          return res.send("password != repeat password");
 
      });
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 31
18.01.2017, 20:42  [ТС] 15
Цитата Сообщение от BANO Посмотреть сообщение
Да, скобочку забыл убрать...
хехе, шутка удалась

Решил проблему. Дело было вовсе не в колбэках. Если так посмотреть, то твой последний и предпоследний вариант кода такой же, что и тот, который я скидывал до этого. А вот и само решение проблемы (приведу код на coffee, потому что он у меня на coffee):
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
db.all "SELECT * FROM users WHERE login=$login",
                $login: login
                , (err, rows) ->
                    if err
                        console.log err
                        res.send "error"
                    else if !rows[0]
                        if password == repeat_password
                            db.run "INSERT INTO users(login, password) VALUES($login, $password)",
                                $login: login
                                $password: password
                                , (err) ->
                                    console.log err
                            t = 'тут слишком длинная строка1'
                            res.send t
                        else
                            res.send "пароли не совпадают"
                    else
                        res.send 'тут слишком длинная строка2'
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2017, 20:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Не корректно работает функция ЕСЛИ
Здравствуйте уважаемые знатоки! У меня возникла проблема, которую я не могу понять, но очень...

не корректно работает функция .splice()
Всем привет! У меня возникла проблема, и я ни как ни могу её решить, весь день сижу и ломаю...

функция удаления работает не корректно почему???
функция удаления в контрольной не работает... возился два дня с ней никак не могу сделать чтоб...

Поиск рабочей прокси(функция работает не корректно)
Понадобились прокси для парсинга. Сграбил, прочекал прокси, загрузил на серв. Запустил, многие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.