다른 사람들이 응답 한 후 문제는 지역 변수라고 진술했습니다. 이 작업을 수행하는 쉬운 방법은 로컬 변수를 포함하는 하나의 외부 함수를 작성한 다음 이름이 지정된 내부 함수를 사용하여 이름으로 액세스하는 것입니다. 이런 식으로, 몇 개의 함수를 연결해야하는지에 관계없이 두 개의 깊이 만 중첩합니다.
mysql
중첩 을 사용하여 Node.js 모듈 을 사용하려는 초보자의 시도는 다음과 같습니다 .
function with_connection(sql, bindings, cb) {
pool.getConnection(function(err, conn) {
if (err) {
console.log("Error in with_connection (getConnection): " + JSON.stringify(err));
cb(true);
return;
}
conn.query(sql, bindings, function(err, results) {
if (err) {
console.log("Error in with_connection (query): " + JSON.stringify(err));
cb(true);
return;
}
console.log("with_connection results: " + JSON.stringify(results));
cb(false, results);
});
});
}
다음은 명명 된 내부 함수를 사용한 재 작성입니다. 외부 함수 with_connection
도 지역 변수의 홀더로 사용할 수 있습니다. (여기서, I는 매개 변수있어 sql
, bindings
, cb
유사한 방법으로 그 행동을하지만, 당신은 단지 몇 가지 추가 지역 변수를 정의 할 수 있습니다 with_connection
.)
function with_connection(sql, bindings, cb) {
function getConnectionCb(err, conn) {
if (err) {
console.log("Error in with_connection/getConnectionCb: " + JSON.stringify(err));
cb(true);
return;
}
conn.query(sql, bindings, queryCb);
}
function queryCb(err, results) {
if (err) {
console.log("Error in with_connection/queryCb: " + JSON.stringify(err));
cb(true);
return;
}
cb(false, results);
}
pool.getConnection(getConnectionCb);
}
인스턴스 변수로 객체를 만들고 이러한 인스턴스 변수를 로컬 변수 대신 사용할 수 있다고 생각했습니다. 그러나 이제 중첩 함수와 로컬 변수를 사용하는 위의 접근 방식이 더 간단하고 이해하기 쉽다는 것을 알았습니다. OO를 배우려면 약간의 시간이 걸립니다. :-)
여기 객체와 인스턴스 변수가있는 이전 버전이 있습니다.
function DbConnection(sql, bindings, cb) {
this.sql = sql;
this.bindings = bindings;
this.cb = cb;
}
DbConnection.prototype.getConnection = function(err, conn) {
var self = this;
if (err) {
console.log("Error in DbConnection.getConnection: " + JSON.stringify(err));
this.cb(true);
return;
}
conn.query(this.sql, this.bindings, function(err, results) { self.query(err, results); });
}
DbConnection.prototype.query = function(err, results) {
var self = this;
if (err) {
console.log("Error in DbConnection.query: " + JSON.stringify(err));
self.cb(true);
return;
}
console.log("DbConnection results: " + JSON.stringify(results));
self.cb(false, results);
}
function with_connection(sql, bindings, cb) {
var dbc = new DbConnection(sql, bindings, cb);
pool.getConnection(function (err, conn) { dbc.getConnection(err, conn); });
}
그것은 bind
어떤 이점으로 사용될 수 있음 이 밝혀졌습니다 . 메소드 호출에 자신을 전달하는 것 외에는 아무 것도하지 않은 내가 만든 다소 추악한 익명 함수를 제거 할 수 있습니다. 의 잘못된 값과 관련되어 있기 때문에 메소드를 직접 전달할 수 없습니다 this
. 그러나을 bind
사용하면 this
원하는 값을 지정할 수 있습니다 .
function DbConnection(sql, bindings, cb) {
this.sql = sql;
this.bindings = bindings;
this.cb = cb;
}
DbConnection.prototype.getConnection = function(err, conn) {
var f = this.query.bind(this);
if (err) {
console.log("Error in DbConnection.getConnection: " + JSON.stringify(err));
this.cb(true);
return;
}
conn.query(this.sql, this.bindings, f);
}
DbConnection.prototype.query = function(err, results) {
if (err) {
console.log("Error in DbConnection.query: " + JSON.stringify(err));
this.cb(true);
return;
}
console.log("DbConnection results: " + JSON.stringify(results));
this.cb(false, results);
}
// Get a connection from the pool, execute `sql` in it
// with the given `bindings`. Invoke `cb(true)` on error,
// invoke `cb(false, results)` on success. Here,
// `results` is an array of results from the query.
function with_connection(sql, bindings, cb) {
var dbc = new DbConnection(sql, bindings, cb);
var f = dbc.getConnection.bind(dbc);
pool.getConnection(f);
}
물론 Node.js 코딩을 사용한 올바른 JS는 없습니다. 방금 몇 시간을 보냈습니다. 그러나 약간의 연마 로이 기술이 도움이 될 수 있습니까?