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) => {
// ...
});
}
我有一个 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) => {
// ...
});
}