Node.js class 属性 在对象中设置后未填充

Node.js class property not being populated after being set in the object

我有一个 class 用于处理 mysql 连接。它有一个用于创建连接池的函数和一个用于 运行ning 插入的函数。问题是,当我尝试 运行 插入 pool.query 时,函数失败。它产生的错误是:

  errorMessage: TypeError: Cannot read property 'pool' of undefined

this.pool 属性 似乎在执行 insert() 函数之前没有定义。

为什么 pool 属性 在 conn.createPool 调用中定义时未定义?

这是连接 class:

const mysql2 = require('mysql2');

class Connection {
    constructor(options = {}) {
        this.options = options
    }

    createPool () {
        this.pool = mysql2.createPool({
            host: this.options.host,
            user: this.options.user,
            database:  'my-db',
            ssl: 'Amazon RDS',
            password: this.options.password,
            authPlugins: {
                mysql_clear_password: () => () => Buffer.from(this.options.password + '[=14=]')
            }
        });
    }

    insert () {
        const promise = new Promise(function (resolve, reject) {

            try {
                let sql = "INSERT INTO included_network(field1, field2, field3, created_date, modified_date, created_by, modified_by) VALUES ?";
                let values = [
                    ['229', 'data1', 'moredata', Date.now(), Date.now(), 'service', 'service'],
                    ['608', 'data2','moredata', Date.now(), Date.now(), 'service', 'service'],
                    ['608', 'data3','moredata', Date.now(), Date.now(), 'service', 'service'],
                    ['673', 'data4','moredata', Date.now(), Date.now(), 'service', 'service'],
                ];

                this.pool.query(sql, [values],function (error, results, fields) {
                    if (error) throw error;
                    console.log(results.affectedRows); //Show 1
                    resolve (results.affectedRows);
                });
            } catch (e) {
                reject(e);
            }

        })
        return promise;
    }
}

module.exports = { Connection };

这是试图使用 class 创建连接并执行插入的处理程序:

const utils = require('./utils');
const conns = require('./connection');


let response = {
  statusCode: 200,
  body: {
    message: 'SQS event processed.',
  },
};

exports.handler = async(event) => {
  try {
    const options = {
      host: 'aurora-proxy.proxy.us-east-1.rds.amazonaws.com',
      user: 'service'
    };

    const token = utils.getToken(options);
    options.password = token;

    const conn = new conns.Connection(options);
    conn.createPool();
    await conn.insert();
    
  } catch (e) {
    console.log('There was an error while processing', { errorMessage: e});

    response = {
      statusCode: 400,
      body: e
    }

  }

  return response;
};

因为 this 在您的 promise 的回调函数中未定义 - 它确实 not 指向 class 实例。

使用箭头函数获取词法范围的 this 指针(这是您所期望的)。

例如

  insert() {
    return new Promise((resolve, reject) => {
      // ...
    });
  }