These are chat archives for nodejs/nodejs-ru

26th
Aug 2016
Алексей
@Alexey-Myshevskiy
Aug 26 2016 09:35
Добрый день сообщество.
Помогите пожалуйста.
Я пытаюсь получить количество строк из mysql через promise, внутри модуля все хорошо, но когда отдаю результат через resolve в другом модуле получаю такое:
OkPacket { fieldCount: 0, affectedRows: 1, insertId: 0, serverStatus: 34, warningCount: 0, message: '(Rows matched: 1 Changed: 1 Warnings: 0', protocol41: true, changedRows: 1 }
Вот мой код...
getCountOfUnclosed: function (userID) {
            return new Promise((resolve, reject) => {
                getConnection()
                    .then((conncetion)=> {
                        var query = conncetion.query("SELECT COUNT(*) AS countOfUnclosedTasks FROM Tasks WHERE `is_resolved`=false AND `user_id`=?", userID);
                        query
                            .on('error', (SqlError)=> {
                                Logger.error(SqlError.stack);
                                conncetion.release();
                                reject(SqlError.stack);
                            })
                            /*.on('fields', function(fields) {
                                console.log(fields);
                            })*/
                            .on('result', (row) => {
                                //here all ok => 3 or 5
                                resolve(row.countOfUnclosedTasks);
                            })
                            .on('end', (row)=> {
                                conncetion.release();
                            });

                    })
            });
        }
// в модуле где вызываеться этот метод получеться не тот результат который я ожидаю
 if (isMember) {

                Task.closeTask(req.body.groupID, req.session.user.uid)
                    .then(Task.getCountOfUnclosed(req.session.user.uid))
                    .then((count)=> {
                        console.log(count);// return OkData :( !!
                        if (count > 0) { // Число не закрытых задач
                            res.status(200).json({isClosedTask: true, isActivated: false});
                        }
                        else {// Если все задачи закрыты и группу можно активировать
                            Group.activateGroup(req.session.user.uid)
                                .then(()=> {
                                    res.status(200).json({isClosedTask: true, isActivated: true});
                                })
                        }
                    })
                    .catch((Error)=> {
                    console.error(Error);
                    res.status(500).end();
                });
            }
Andrey Sidorov
@sidorares
Aug 26 2016 10:46
on('result') вызывается на каждую строку - не очень лучшее место для того чтобы вызывать resolve()
хотя тут только одна строка возвращается
Алексей
@Alexey-Myshevskiy
Aug 26 2016 10:47
угу
Я не нашел выход, поэтому подумал что тут не много преимуществ обещаний, и сделал через коллбеки. И все работает.
Andrey Sidorov
@sidorares
Aug 26 2016 10:49
не проще conn.query('select ...', (err, rows) => { if (err) return reject(err); resolve(rows[0]. countOfUnclosedTasks) }) ?
Алексей
@Alexey-Myshevskiy
Aug 26 2016 10:49
так было изначально, и тот же эффект
Andrey Sidorov
@sidorares
Aug 26 2016 10:50
shameless plug: в mysql2 из коробки есть Promise api
Алексей
@Alexey-Myshevskiy
Aug 26 2016 10:51
@sidorares Буду знать спасибо, я решил проблему через коллбек.
Andrey Sidorov
@sidorares
Aug 26 2016 10:51
я почти уверен что результат от другой комманды
если есть affectedRows и т.д - то это ответ от insert/delete
у селекта всегда массив строк в ответ ( даже если пустой результат )
Алексей
@Alexey-Myshevskiy
Aug 26 2016 10:53
неисключено что я плохо знаю промисы и что-то сделал был не так.