2017-01-16 1 views
0

Im 'nodej에 첫 번째 모듈을 빌드하려고합니다. 이것은 내 모듈은nodejs 모듈의 변수에 액세스

입니다 ...

var express = require('express'); 
var router = express.Router(); 
var sqlite3 = require('sqlite3').verbose(); 
var db; 
var io = require('socket.io-client'); 
const notifier = require('node-notifier'); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    createDb(); 
    socket = io.connect('http://localhost:4000'); 
    socket.on('connect',() => { 
     console.log("socket connected"); 
    }); 
    socket.on('message', (contenu) => { 
     console.log('message received'); 
     console.log(contenu); 
     notifier.notify(contenu.contenu); 
    }); 
    socket.emit('message', { contenu : 'test'}); 
    res.render('index', { title: 'Accueil' }); 
}); 

/* SQLite */ 
function createDb() { 
    console.log("createDb chain"); 
    db = new sqlite3.Database('./database_institut-villebon.db', createTable); 
} 

function createTable() { 
    console.log("createTable etudiants"); 
    db.run("DROP TABLE IF EXISTS etudiants"); 
    db.run("CREATE TABLE IF NOT EXISTS etudiants (Nom TEXT, NumeroGroupe INTEGER, NumeroCandidat INTEGER PRIMARY KEY, Filiere TEXT)", insertRows); 
} 

function insertRows() { 
    console.log("insertRows in etudiants"); 
    var stmt = db.prepare("INSERT INTO etudiants VALUES (?,?,?,?)"); 

    for (var i = 0; i < 3; i++) { 
     stmt.run("John Doe",i,i,"S"); 
    } 

    stmt.finalize(readAllRows); 
} 

function readAllRows() { 
    console.log("readAllRows etudiants"); 
    db.all("SELECT rowid AS id, Nom, NumeroGroupe, NumeroCandidat, Filiere FROM etudiants", function(err, rows) { 
     rows.forEach(function (row) { 
      console.log(row.id + ": " + row.NumeroCandidat +","+ row.Filiere); 
     }); 
     closeDb(); 
    }); 
} 

function closeDb() { 
    console.log("closeDb"); 
    db.close(); 
} 

function runChain() { 
    createDb(); 
} 

module.exports = router; 

을하지만 난이 모듈에 넣어하려고 할 때이 테이블이 존재하지 않는 "etudiants"라고 : 이 코드가 완벽하게 작동이

var sqlite3 = require('sqlite3').verbose(); 

"use strict"; 

/* SQLite */ 
var BddUtils = function() { 
    console.log("createDb chain"); 
    this.database = new sqlite3.Database('./database_institut-villebon.db'); 
} 

BddUtils.prototype.closeDb = function() { 
    console.log("closeDb"); 
    this.database.close(); 
} 

BddUtils.prototype.readAllRows = function() { 
    console.log("readAllRows etudiants"); 
    this.database.all("SELECT rowid AS id, Nom, NumeroGroupe, NumeroCandidat, Filiere FROM etudiants", function(err, rows) { 
     rows.forEach(function (row) { 
      console.log(row.id + ": " + row.NumeroCandidat +","+ row.Filiere); 
     }); 
     this.database.closeDb(); 
    }); 
} 

BddUtils.prototype.insertRows = function() { 
    console.log("insertRows in etudiants"); 
    var stmt = this.database.prepare("INSERT INTO etudiants VALUES (?,?,?,?)"); 
    for (var i = 0; i < 3; i++) { 
     stmt.run("John Doe",i,i,"S"); 
    } 
    //stmt.finalize(this.readAllRows()); 
} 

BddUtils.prototype.createTable = function() { 
    console.log("createTable etudiants"); 
    this.database.run("DROP TABLE IF EXISTS etudiants"); 
    this.database.run("CREATE TABLE IF NOT EXISTS etudiants (Nom TEXT, NumeroGroupe INTEGER, NumeroCandidat INTEGER PRIMARY KEY, Filiere TEXT)", this.insertRows()); 
} 

BddUtils.prototype.init = function() { 
    this.createTable(); 
} 

exports.BddUtils = exports = new BddUtils(); 

나는 문제를 찾고 있었고 나는 테이블을 떨어 뜨리지 않으면 모든 것이 작동한다는 것을 알았다. 그래서 "insertRows"함수가 테이블 생성 전에 호출된다고 가정합니다 ... 그러나 콜백 함수입니다 ... 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

편집 : 나는 뭔가 어쩌면 해요 :

함수의 컨텍스트 (함수 내부의이 객체) 문 객체입니다. 문을 처음 실행하면 자동으로 완료되므로 문을 다시 실행할 수 없습니다. 문을 다시 실행하려고 시도하면 이 실패합니다. 실행이 성공하면

,이 개체는 두 lastID 명명 된 속성 및 삽입 마지막 행 ID의 값이 쿼리 각각 영향 행수를 포함 변화를 포함 할 것이다. 쿼리가 성공적으로 완료된 INSERT 문이었고 변경 내용이 성공적으로 UPDATE 또는 DELETE 문을 완료했을 때 유효한 정보 만 포함되어있는 경우 lastID에 유효한 정보 만 포함됩니다. 다른 모든 경우에는 의 내용이 정확하지 않으므로 사용해서는 안됩니다. .run() 함수는이 두 값을 설정하는 유일한 쿼리 메서드입니다. 모두 .all() 또는 .get()과 같은 다른 쿼리 메서드는 이러한 값을 검색하지 않습니다. 당신이에 CREATE TABLE 문을 포장하여 필요 같은

그래서 내 this.database이 ... 더 이상 현재 컨텍스트에없는 진행하는 방법을 알고하지 않는 것이 가능은 ..

답변

1

같습니다 Database.serialize() function.

데이터베이스 # 1 직렬화 ([콜백])

연재로 실행 모드를 둔다. 즉, 최대 하나의 명령문 오브젝트가 한 번에 조회를 실행할 수 있습니다. 다른 문은 이전 문이 실행될 때까지 대기열에 을 대기합니다.

이렇게하면 CREATE TABLE 문이 단독으로 실행됩니다.

문서에서 제공되는 예 : DB를 사용하여 해결

db.serialize(function() { 
    // These two queries will run sequentially. 
    db.run("CREATE TABLE foo (num)"); 
    db.run("INSERT INTO foo VALUES (?)", 1, function() { 
    // These queries will run in parallel and the second query will probably 
    // fail because the table might not exist yet. 
    db.run("CREATE TABLE bar (num)"); 
    db.run("INSERT INTO bar VALUES (?)", 1); 
    }); 
}); 
+0

는를 보라 [약속 (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise),보다 일반적이다 (매우 편리한) 개념을 사용하여 임의의 (비동기) 흐름을 제어 할 수 있습니다. – sgtdck

+0

도움 주셔서 감사합니다! Promies를 사용해 보았지만 this.database가 정의되지 않았다 ... (정의되지 않은 속성을 읽을 수 없음). 범위에 문제가 있습니다. var p1 = new Promise ( ) { console.log ("createTable etudiants"); this.database.run ("DROP TABLE IF EXISTS etudiants"); this.database.run ("테이블이 존재하지 않으면 테이블을 만듭니다 (NEXT, NumeroGroupe INTEGER, NumericCandidat INTEGER PRIMARY TEXT)");); } ); –

+0

은 bd.serialize()와 많이 작동합니다. –

0

.대안 직렬화()

BddUtils.prototype.createTable = function() { 
    var db = this.database; 

    db.serialize(function() { 
     console.log("createTable etudiants"); 
     db.run("DROP TABLE IF EXISTS etudiants"); 
     db.run("CREATE TABLE IF NOT EXISTS etudiants (Nom TEXT, NumeroGroupe INTEGER, NumeroCandidat INTEGER PRIMARY KEY, Filiere TEXT)"); 
     var stmt = db.prepare("INSERT INTO etudiants VALUES (?,?,?,?)"); 
     for (var i = 0; i < 3; i++) { 
      stmt.run("John Doe",i,i,"S"); 
     } 
     stmt.finalize(function(){ 
     console.log("readAllRows etudiants"); 
     db.all("SELECT rowid AS id, Nom, NumeroGroupe, NumeroCandidat, Filiere FROM etudiants", function(err, rows) { 
      rows.forEach(function (row) { 
       console.log(row.id + ": " + row.NumeroCandidat +","+ row.Filiere); 
      }); 
      db.close(); 
     }); 
     }); 
    }) 
} 
관련 문제