NodeJS->错误无法读取未定义的属性“长度”

时间:2020-02-18 12:30:17

标签: mysql sql node.js express postman

如果用户名已经存在,我想向mysql数据库进行查询,他应该向我发送一条消息,如果不存在,请向我显示新ID。我想检查查询result.lenght是否高于0。 但是会引发错误“无法读取未定义的属性'length'”

服务文件

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作为数据库。我还尝试用username.length替换result.length,但是它会出现“未定义错误的用户名”的问题...

1 个答案:

答案 0 :(得分:1)

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