【问题标题】:NodeJS MySQL and Promises - Cannot read property 'query' of undefined?NodeJS MySQL 和 Promises - 无法读取未定义的属性“查询”?
【发布时间】:2021-09-12 00:24:00
【问题描述】:

我只是在学习使用 Promise,但不确定我遇到的这个错误;

  Cannot read property 'query' of undefined

我已经简化了我的查询,但仍然出现错误。所以我猜这可能与我用于 MySQL 数据库的类有关。这是我进行查询的地方;

var createAudiopost = async function(req, res, next){     
let row_a, row_b, row_c, row_d, row_e, row_f;    
try {    
    row_a = await mydb.query( 'SELECT * FROM audioposts'); 
     
     console.log("success");  
     res.json({     "title" : title, 
                    "userid" : userid,
                    "opid" : opid, 
                    "insert
            });     
}                           
catch(err) {
    console.log(err.message);
}
finally {
    mydb.close();
        }
}

 module.exports = createAudiopost;

我在这里为 MySQL 数据库创建了一个类;

const mysql = require( 'mysql' );

let config = {
    host     : 'localhost',
    user     : 'user',
    password : 'password',
    database: 'database'
};

class DataBase {
    constructor( config ) {
        this.connection = mysql.createConnection( config );
    }
    query( sql, args ) {
        return new Promise( ( resolve, reject ) => {
            this.database.query( sql, args, ( err, rows ) => {
                if ( err )
                    return reject( err );
                resolve( rows );
            } );
        } );
    }
    close() {
        return new Promise( ( resolve, reject ) => {
            this.connection.end( err => {
                if ( err )
                    return reject( err );
                resolve();
            } );
        } );
    }
}

const mydb = new DataBase(config); 

为什么我的控制台告诉我查询未定义?

【问题讨论】:

    标签: mysql node.js promise node-mysql nodejs-server


    【解决方案1】:

    你需要绑定你的promise函数:

        query( sql, args ) {
            return new Promise( function ( resolve, reject ) {
                this.connection.query( sql, args, ( err, rows ) => {
                    if ( err )
                        return reject( err );
                    resolve( rows );
                } );
            }.bind(this) );
        }
    

    或者你可以使用别名

        query( sql, args ) {
            let that = this;
            return new Promise( function ( resolve, reject ) {
                that.connection.query( sql, args, ( err, rows ) => {
                    if ( err )
                        return reject( err );
                    resolve( rows );
                } );
            });
        }
    

    【讨论】:

    • 我得到:SyntaxError: missing ) after argument list
    • 对于第二个示例,我遇到了同样的错误 - 无法读取未定义的属性“查询”
    • 我的错,箭头函数不接受绑定,另外,在你的代码中你有this.connection,而不是this.database
    • 是否可以修改您的答案以反映必要的更改?
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2019-11-21
    • 2016-01-07
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-12-13
    • 2018-12-21
    相关资源
    最近更新 更多