在nodejs模块中访问变量

时间:2017-01-16 08:18:53

标签: javascript node.js asynchronous module

我试图在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”函数...但它是一个回调函数.... 如果提前感谢,任何帮助都会受到赞赏。

编辑:我可能会做点什么:

  

函数的上下文(函数内部的this对象)是   声明对象。请注意,无法运行   再次声明,因为它在运行后自动完成   首次。任何后续尝试再次运行该语句   会失败。

     

如果执行成功,则此对象将包含两个   名为lastID的属性和包含该值的更改   最后插入的行ID和受此查询影响的行数   分别。请注意,lastID仅包含有效信息   查询是一个成功完成的INSERT语句并进行了更改   查询成功时仅包含有效信息   完成UPDATE或DELETE语句。在所有其他情况下,内容   这些属性是不准确的,不应使用。运行()   function是唯一设置这两个值的查询方法;所有   其他查询方法(如.all()或.get())不会检索这些方法   值。

所以我的this.database可能不在当前的上下文中......不知道如何继续......

2 个答案:

答案 0 :(得分:1)

看起来您需要将CREATE TABLE语句包装成Database.serialize() function

  

<强>数据库#序列化([回调])

     

将执行模式设置为序列化。这意味着最多一个   statement对象可以一次执行一个查询。其他陈述等待   在队列中,直到执行前面的语句。

这可确保CREATE TABLE语句独立执行。

来自文档的示例:

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

答案 1 :(得分:0)

使用db.serialized()

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