2014-01-19 2 views
1

일부 데이터베이스 쿼리를 수행하는 node.js 스크립트가 있는데 정상적으로 작동합니다. 스크립트가 조금 더 길어지기 시작 했으므로 데이터베이스 연결 코드를 다른 파일로 옮겨 놓은 것이 합리적이라고 생각했습니다.node.js - 내보내기 변수 오류 필요

다음은 내가 다른 파일로 옮긴 다음 require 문에 포함시킨 코드입니다.

내가 겪고있는 문제는 스크립트 맨 아래의 '내보내기'명령에 있습니다. 'dbHandleDisconnectUsers()'함수는 올바르게 반출되지만 'dbConnectionUsers'변수는 반출되지 않습니다.

스크립트 오류는 'dbConnectionUsers'객체의 메소드를 참조합니다. (올바른 터미널 문자가 필요합니다.) 누락되어 실제로 완전한 객체를 전달하지 못하고 있다는 인상을줍니다. 참고 : 나는 정확한 오류를 포함 시키겠다. 그러나 나는 기계 앞에 없다. 핵심 스크립트에서

var mysql = require('/usr/lib/node_modules/mysql'); 
// Users Database Configuration 
var dbConnectionUsers; 
var dbConfigurationUsers = ({ 
    host  : 'xxxxx', 
    user  : 'xxxxx', 
    password : 'xxxxx', 
    database : 'xxxxxx', 
    timezone : 'Asia/Singapore' 
}); 


// Users Database Connection & Re-Connection 
function dbHandleDisconnectUsers() { 
    dbConnectionUsers = mysql.createConnection(dbConfigurationUsers); 

    dbConnectionUsers.connect(function(err) { 
    if(err) { 
     console.log('Users Error Connecting to Database:', err); 
    }else{ 
     dbConnectionUsers.query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;"); 
     dbConnectionUsers.query("SET SESSION sql_mode = 'ANSI';"); 
     dbConnectionUsers.query("SET NAMES UTF8;"); 
     dbConnectionUsers.query("SET time_zone='Asia/Singapore';"); 
    } 
    }); 

    dbConnectionUsers.on('error', function(err) { 
    console.log('Users Database Protocol Connection Lost: ', err); 
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { 
     dbHandleDisconnectUsers(); 
    } else { 
     throw err; 
    } 
    }); 
} 
dbHandleDisconnectUsers(); 


exports.dbHandleDisconnectUsers() = dbHandleDisconnectUsers(); 
exports.dbConnectionUsers = dbConnectionUsers; 

나는이 문 필요가 있습니다

var database = require('database-connect.js'); 

을 그리고

database.dbHandleDisconnectUsers() 
database.dbConnectionUsers 
+4

'exports.dbHandleDisconnectUsers() = ...'는'exports.dbHandleDisconnectUsers()'의 결과에 * 값을 할당하려고합니다. 일반적으로 불가능합니다 (왜냐하면 재미의 결과 ction 호출은 변수 참조가 아닙니다). (전체 공개 : 함수는 * 참조를 반환 할 수 있지만 [호스트 객체 만 가능] (http://www.ecma-international.org/ecma-262/5.1/#sec-8.7), 정규 JS가 아닌 code.) 어쨌든'exports.dbHandleDisconnectUsers'는 아직 정의되지 않았기 때문에 아직 호출 할 함수가 없습니다. – apsillers

답변

3

그것은 당신의 기능이 작동되는 것은 이상하지만, 다른 변수로 함수/변수를 참조 내보내기가 아닙니다. 이것은 사실이 아니어야합니다.

일반적으로 함수를 내보내는 경우 평가 함수 (예 : aFunction())로 내보내려는 것이 아닙니다. 그 함수가 무엇이든간에 반출을 원한다면, 또는 모듈의 일부로 생성자 함수의 인스턴스를 내보내려는 경우에만 할 수 있습니다.

다른 점은 실제로 이상하고 위의 설명에서 언급 한 것입니다. exports.dbHandleDisconnectUsers()에 값을 지정하려고합니다.이 값은 정의되지 않아야하며 오류가 발생합니다.

즉, 코드는 exports.whatever() = whatever()이 아니어야합니다. 이 잘못 여기에 유일한 경우

exports.dbHandleDisconnectUsers = dbHandleDisconnectUsers; // no evaluation() 
exports.dbConnectionUsers = dbConnectionUsers; 

나도 몰라,하지만이 확실히 원인이 될 수있는 한 가지입니다 :

대신이 같은 기능 및 기타 속성을 모두 내 보내야합니다 실행 오류 또는 두 :)

또한, Brandon이 지적한 것을 고려하여 처음에 정의되지 않은 것을 내보내는 중입니다. 하지만 스크립트에서 어쨌든 참조를 덮어 쓰고 있습니다.

대신해야 할 일은 영구적이며 업데이트 할 수있는 속성이있는 새 개체 참조를 만드는 것입니다. 예 :

var dbConnection = {users: null}; 
exports.dbConnection = dbConnection; 

당신이 당신의 기능을 실행할 그런 때

function dbHandleDisconnectUsers() { 
    dbConnection.users = mysql.createConnection(dbConfigurationUsers); 

    dbConnection.users.connect(function(err) { 
    if(err) { 
     console.log('Users Error Connecting to Database:', err); 
    }else{ 
     dbConnection.users.query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;"); 
     dbConnection.users.query("SET SESSION sql_mode = 'ANSI';"); 
     dbConnection.users.query("SET NAMES UTF8;"); 
     dbConnection.users.query("SET time_zone='Asia/Singapore';"); 
    } 
    }); 

    dbConnection.users.on('error', function(err) { 
    console.log('Users Database Protocol Connection Lost: ', err); 
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { 
     dbHandleDisconnectUsers(); 
    } else { 
     throw err; 
    } 
    }); 
} 

이 방법 dbConnection의 객체 참조가 덮어 쓰기되지 않습니다.

당신은 다음과 같은 모듈에 users데시벨 연결을 참조합니다 :

database.dbConnection.users 

당신이 전에 그것을 사용하여 의도 한대로 기능이 계속 작동합니다 : 구문을 무시

database.dbHandleDisconnectUsers(); 
4

다른 사람들이 exports.dbHandleDisconnectUsers() = dbHandleDisconnectUsers()에서 지적한 오류는 dbConnectionUsers가 초기화되지 않았다는 것을 지적합니다.

자바 스크립트를 통과별로 복사의 참조 언어 따라서이 라인이다 :

var dbConnectionUsers; 
exports.dbConnectionUsers = dbConnectionUsers; 

가 나중에 dbConnectionUsers을 설정하더라도

exports.dbConnectionUsers = undefined; 

본질적으로 동일합니다, 당신은하지 않습니다 원래 dbConnectionUsers 참조 사본을 가지고 있기 때문에 exports.dbConnectionUsers에 영향을줍니다.

Behavior of require in node.js : 나는 동일한 주제에 게시 된 최근의 대답에 당신을 참조 할 방법 requiremodule.exports 작업에 대한 자세한 내용은

var x = 5; 
var y = x; 
x = 1; 

console.log(x); // 1 
console.log(y); // 5 

:

이에, 기본 데이터 형에, 유사