【问题标题】:NodeJS -> Error Cannot read property 'length' of undefinedNodeJS->错误无法读取未定义的属性“长度”
【发布时间】:2020-06-02 11:28:09
【问题描述】:

如果用户名已经存在,我想查询 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
            }));
};

控制器文件

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 但它会出现“未定义错误用户名”...

【问题讨论】:

  • 你的 npm mysql 版本是多少?
  • 我得到了 2.18.1 版本

标签: mysql sql node.js express postman


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2015-02-05
    • 2017-11-25
    相关资源
    最近更新 更多