NodeJS -> Ошибка Не удается прочитать свойство 'длина' из неопределенного - PullRequest
2 голосов
/ 18 февраля 2020

Я хотел сделать запрос к базе данных mysql, если имя пользователя уже существует, он должен бросить мне сообщение, а если нет, показать мне новый идентификатор. Я хотел проверить, является ли результат result.lenght больше 0. Однако он выдает ошибку "Не удается прочитать свойство 'длина' из неопределенного"

Сервисный файл

const connect = () =>
    mysql.createConnection({
        host: process.env.MYSQL_HOST,
        user: process.env.MYSQL_USER,
        password: process.env.MYSQL_PASSWORD,
        database: process.env.MYSQL_DATABASE
    });
const insert = (conn, user) => {
    return conn.query(`insert into user(username, firstName, lastName, password)   
    values(?,?,?,?)`,
        [
            user.username,
            user.firstName,
            user.lastName,
            user.password
        ]
    )
}
const getByUsername = username => {
    return connect()
        .then(conn => {
            conn.query( 
                `select id, username, firstName, lastName
                from user
                where username = ?`,
                [username]  
            );
        })
}

const create = user => {

    return getByUsername(user.username)
        .then(result => {
            if (result.length > 0) {
                throw new Error(`User "${user.username}" already exists`);
            }
        })
        .then(() => connect())
        .then(conn => insert(conn, user))    
        .then(result =>
            ({
                id: result.insertId
            }));
};

Файл контроллера

const create = (req, res) => {

    userService.create(req.body)
        .then(result => {
            res.status(200);
            res.json(result);
        })
        .catch(err => {
            res.status(500);
            res.send('Error ' + err.message);
        })
}

Я пытался определить длину, но я думаю, что это не проблема. Я делаю запрос с почтальоном, и я использую mysql в качестве базы данных. Я также попытался заменить result.length на username.length, но оно показало "Ошибка имени пользователя не определена" ...

1 Ответ

1 голос
/ 18 февраля 2020

result может быть там не определено. Потому что мы не возвращаем правильные результаты запроса. Вот почему мы получаем ошибку.

Решение:

const getByUsername = username => {
    return new Promise((resolve, reject) => {
        connect()
            .then(conn => {
                conn.query( 
                    `select id, username, firstName, lastName
                    from user
                    where username = ?`,
                    [username],
                    function(err, results) {
                        if (err) {
                            return reject(err);
                        }
                        return resolve(results)
                    }  
                );
            })
    });
}

Объяснение:

Согласно mysql2 документация, conn.query не вернет результаты. У метода conn.query есть третий аргумент, который является методом обратного вызова. Здесь мы можем получить ошибку запроса SQL и результаты запроса.

Используя javascript Promise API, мы можем принять решение отклонить или решить на основе результата запроса SQL.

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