@lyrion

Как сделать promise из callback?

Добрый день, не могу понять обернуть метод в promise.
Ситуация следующая, есть сервер на node.js с express. В качестве БД решил использовать mysql. На стороне сервера я проверяю заполнение формы регистрации и в случае несоответствия собираю объект с ошибками и посылаю его на клиент. Одна из проверок на существование логина и вот тут я застрял, т.к. ответ от БД приходит с какой-то задержкой, а как это все поместить в промис я не понимаю.
const express   = require('express');
const mysql     = require('mysql');

const connection = mysql.createConnection({
    host: `localhost`,
    user: `root`,
    password: ``,
    database: `${dbName}`,
});

function verifyData(userData){
    let ipErr = verifyIp(userData.ip);
    let nameErr = verifyName(userData.name);
    let loginErr = verifyLogin(userData.login);
    let passErr = verifyPass(userData.pass, userData.repass);

    return {ip: ipErr, name: nameErr, login: loginErr, pass: passErr};
}

function verifyLogin(login){
    let result = 0;
    const sql = `SELECT login FROM user_data WHERE login = '${login}'`;
    connection.query(sql,
        function selectUser (error, results, fields) {
            if (error) throw error;
            if(results[0] !== undefined){
                result = 'Логин уже используется';
            }
        });
    return result;
}

Как вы поняли в качестве result в verifyLogin мне бы хотелось получать и ошибку, а так возвращается всегда 0. Куда засунуть async, await или promise, чтобы result отправлялся только после выполнения функции запроса?
  • Вопрос задан
  • 628 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
\( ゚ヮ゚)/
Если модифицировать Ваш код, то так:
function verifyLogin(login) {
	return new Promise(function (resolve, reject) {
		connection.query(`SELECT login FROM user_data WHERE login = '${login}'`, function (error, results, fields) {
			if (error) {
				reject(error);
			}

			if (results[0] !== undefined) {
				resolve('Логин уже используется');
			} else {
				resolve(0);
			}
		});
	});
}


Еще советую почитать о промисификации.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы