【问题标题】:Node.js class property not being populated after being set in the object在对象中设置后未填充 Node.js 类属性
【发布时间】:2020-10-06 00:53:44
【问题描述】:

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

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

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

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

这是连接类:

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 + '\0')
            }
        });
    }

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

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

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

【问题讨论】:

    标签: node.js aws-lambda amazon-rds


    【解决方案1】:

    因为 this 在你的 promise 的回调函数中没有定义——它确实指向类实例。

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

    例如

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

    【讨论】:

    • 如何同时运行多个insert 调用?我注意到我现在必须在函数调用上使用await,但我宁愿运行多个插入而不等待。我不应该使用 Promise 吗?
    • 做类似await Promise.all([conn.insert(), conn.insert2(), conn.insert3()])
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2010-09-24
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多