mysql - NodeJS -> 错误无法读取未定义的属性 'length'

标签 mysql sql node.js express postman

我想对 mysql 数据库进行查询,如果用户名已经存在,他应该向我发送一条消息,如果不存在,请向我显示新的 ID。我想检查查询 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
            }));
};

Controller 文件

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);
        })
}

我尝试定义长度,但我认为这不是问题。我用 postman 进行查询,并使用 mysql 作为数据库。我还尝试将 result.length 替换为 username.length 但它会出现“错误用户名未定义”...

最佳答案

那里的结果可能是未定义的。因为我们没有返回正确的查询结果。这就是我们收到错误的原因。

解决方案:

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查询结果决定拒绝或解决。

关于mysql - NodeJS -> 错误无法读取未定义的属性 'length',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60280957/

相关文章:

SQL选择多个列中存在的多个值

javascript - 使用另存为对话框将 HTML 表格数据导出到 Excel (JQuery)

mysql - Crystal 郎 : can't compile App with MySQL library on OSX El Capitan

php - 需要通过php文件更改mysqli_query输出格式

mysql - 如何处理 INSERT 但拒绝更新 MySQL 中的某些列?

mysql - 索引大型 MySQL 表

mysql - 统计今天、昨天……以及其他时间添加的行数

javascript - 未知身份验证策略通行证

javascript - 删除字符不匹配的字符串开头

javascript - 如何使用 google actions sdk 迭代 js 对象数组并在 google Assistant 应用程序中显示列表选择器