在Node.js模块中访问变量

斯蒂芬·卡拉古梅兹(Stephane karagulmez)

我正在尝试在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的值和受此查询影响的行数。请注意,当查询是成功完成的INSERT语句时,lastID仅包含有效信息,而当查询是成功完成的UPDATE或DELETE语句时,changes仅包含有效信息。在所有其他情况下,这些属性的内容都不准确,因此不应使用。.run()函数是设置这两个值的唯一查询方法。所有其他查询方法(例如.all()或.get())都不会检索这些值。

因此,我的this.database可能不在当前上下文中了……不知道如何继续。

sgtdck

看来您需要将CREATE TABLE语句包装到Database.serialize()函数中

Database#serialize([回调])

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

这样可以确保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);
  });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法访问自定义 Node.js 模块中的变量

来自分类Dev

Node.js模块变量

来自分类Dev

Node.js(npm)访问已安装模块中的文件

来自分类Dev

如何从Node.js模块中的请求获取变量

来自分类Dev

玉环无法访问node.js文件中的变量

来自分类Dev

如何在Node.js中访问变量文档ID

来自分类Dev

如何从Node.js中的MySQL访问变量?

来自分类Dev

在 Node.js 中访问环境变量的替代方法

来自分类Dev

从导出的模块(node.js)访问函数

来自分类Dev

在Node.js中,有没有一种方法可以从所需的模块访问父级的变量范围?

来自分类Dev

Node.js中的模块

来自分类Dev

在node.js中,如何从app.js中的另一个模块中的模块访问函数?

来自分类Dev

来自模块的node.js变量

来自分类Dev

模块化gulp / node.js,调用模块变量

来自分类Dev

通过代码设置的env变量在node.js中的导入模块中不可用

来自分类Dev

如何使用Express模块限制对node.js中许多文件夹的访问

来自分类Dev

如何在Node.js模块中访问私有代码?

来自分类Dev

如何使用express模块限制对node.js中许多文件夹的访问

来自分类Dev

如何在Node.js模块中访问私有代码?

来自分类Dev

在Node中的函数外部访问变量

来自分类Dev

是否可以在node.js中为模块变量定义一个set函数

来自分类Dev

如何从function.js中的express和node js访问会话变量

来自分类Dev

在 Javascript 中访问服务器端变量(node.js、express.js、ejs)

来自分类Dev

在Node.js中模拟嵌套模块?

来自分类Dev

测试模块中的node.js类

来自分类Dev

在Node.js中找不到模块

来自分类Dev

Node.js中的模块范围

来自分类Dev

在Node.js中找不到模块

来自分类Dev

node.js 模块中的权限问题

Related 相关文章

热门标签

归档