2017-01-16 5 views
0

Ich versuche, mein erstes Modul in Nodejs zu bauen. Ich habe diesen Code funktioniert perfekt:Accessing Variable in Nodejs Modul

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; 

Aber wenn ich versuche, es in einem Modul sagen, dass die Tabelle „etudiants“ existiert nicht ...

Das ist mein Modul:

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(); 

Ich habe nach einem Problem gesucht und ich fand, dass, wenn ich den Tisch nicht fallen lasse, alles funktioniert! Also ich nehme an, dass die "insertRows" -Funktion vor der Tabelle erstellt wird ... aber es ist eine Rückruffunktion .... Jede Hilfe wird zu schätzen wissen, danke im Voraus.

EDIT: Ich bin vielleicht auf etwas:

Der Kontext der Funktion (die diese Aufgabe innerhalb der Funktion) das Objekt Statement. Beachten Sie, dass es nicht möglich ist, die -Anweisung erneut auszuführen, da sie nach dem erstmaligen Ausführen von automatisch finalisiert wird. Alle nachfolgenden Versuche, die Anweisung erneut auszuführen, schlagen fehl.

Wenn die Ausführung erfolgreich war, wird die Lösung dieser Aufgabe enthält zwei Eigenschaften genannt lastID und Veränderungen, die den Wert der zuletzt eingefügten Zeile ID und die Anzahl von Zeilen enthalten, von dieser Abfrage betroffenen ist. Beachten Sie, dass lastID nur gültige Informationen enthält, wenn die Abfrage eine erfolgreich abgeschlossene INSERT-Anweisung war und Änderungen nur gültige Informationen enthält, wenn die Abfrage erfolgreich eine UPDATE- oder DELETE-Anweisung abgeschlossen hat. In allen anderen Fällen ist der Inhalt dieser Eigenschaften ungenau und sollte nicht verwendet werden. Die Funktion .run() ist die einzige Abfrage-Methode, die diese beiden Werte festlegt. Alle andere Abfrage-Methoden wie .all() oder .get() rufen diese Werte nicht ab.

es ist also möglich, dass meine this.database ist im aktuellen Kontext nicht mehr ... weiß nicht, wie es weitergehen ..

Antwort

1

Es sieht aus wie Sie Ihre CREATE in eine TABLE-Anweisung wickeln müssen Database.serialize() function.

Datenbank # serialize ([Rückruf])

Versetzt den Ausführungsmodus in serialisiert. Das bedeutet, dass höchstens ein Anweisungsobjekt eine Abfrage gleichzeitig ausführen kann. Andere Anweisungen warten in einer Warteschlange, bis die vorherigen Anweisungen ausgeführt werden.

Dies stellt sicher, dass die CREATE TABLE-Anweisung isoliert ausgeführt wird.

Das Beispiel, das aus der Dokumentation kommt:

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

Alternativ haben Sie einen Blick auf [Versprechen] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise), die eine allgemeinere ist (und sehr praktisch), um die Kontrolle über jeden (asynchronen) Fluss zu erlangen. – sgtdck

+0

Danke für Ihre Hilfe! Ich habe mit einem Promies versucht, aber es sagte, dass this.database undefiniert ist ... (kann Property run von undefined nicht lesen). Ich habe Probleme mit Umfang .. var p1 = new Promise ( Funktion (Entschlossenheit, ablehnen) { console.log ("create etudiants"); this.database.run ("DROP TABLE IF EXISTS etudiants"); this.database.run ("CREATE TABLE IFIS EXISTS etudiants (Nom TEXT, NumeroGroupe INTEGER, NumeroCandidat INTEGER PRIMARY KEY, Filiere TEXT)"; } ); –

+0

arbeitet mit bd.serialize() vielen Dank –

0

Gelöst von db verwenden.serialisiert()

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