2017-01-16 8 views
0

Im 'nodejsで最初のモジュールをビルドしようとしています。これは私のモジュールは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"関数は、テーブルを作成する前に呼び出される...しかし、それはコールバック関数です.... 任意の助けに感謝する前に、おかげです。

EDIT:機能(関数内でこのオブジェクト)のコンテキストは ステートメントオブジェクトである

:私は何かに多分ね。 文を初めて実行した後に自動的にファイナライズされるため、 文を再度実行することはできません。ステートメントを再度実行しようとすると、 は失敗します。実行が成功した場合

、このオブジェクトは、二つ lastID名前付きプロパティと 最後に挿入された行のIDの値と、このクエリ それぞれによって影響を受けた行の数が含まれている変更を含むであろう。 クエリが正常に完了したINSERTステートメントであり、 の変更が正常に完了した場合、有効な情報のみを含むことに注意してください。 UPDATEまたはDELETEステートメント。他のすべてのケースでは、これらのプロパティのコンテンツ は不正確であり、使用すべきではありません。 .run() 関数は、これらの2つの値を設定する唯一のクエリメソッドです。すべて .all()や.get()などの他のクエリメソッドは、これらの 値を取得しません。

だから、それはあなたがあなたの中に、CREATE TABLE文をラップする必要があるように見え進め方..

答えて

1

分からない...私のthis.databaseはもう現在のコンテキストではないことが可能です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を試しましたが、このデータベースは未定義であると言われています...(未定義のプロパティを読み取ることはできません)。スコープに問題があります。 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 KEY、Filiere 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(); 
     }); 
     }); 
    }) 
} 
関連する問題