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 ..
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
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)"; } ); –
arbeitet mit bd.serialize() vielen Dank –