обратный вызов не является функцией в sqlite - PullRequest
0 голосов
/ 17 марта 2019

я попытался заставить class DATABASE создать db.run для метода многократного использования, чтобы вызвать обновление для создания и удалить в SQLite с помощью обратного вызова, вот мой код


const db = new sqlite3.Database("database.db", err => {
  if (err) {
    console.log(`can;t connected tp database, status: ${err}`);
  } else {
    console.log(`gotcha, succesfully connect to the database`);
  }
});

class DATABASE {
  static run(sql, params = [], callback) {
    db.run(sql, params, function(err) {
      if (err) {
        throw err;
        console.log(`something wrong with this ${sql}`);
        console.log(err);
        callback(err);
      } else {
        callback({"id" : this.lastID}) // this is could be null also
        console.log("sucesfully fo this ", sql);
      }
    });
  }
}

module.exports = DATABASE;

тогда я называю этот класс чем-то вроде этого:

const DATABASE = require("./setup.js");
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database("database.db", err => {
  if (err) {
    console.log(`can;t connected tp database, status: ${err}`);
  } else {
    console.log(`gotcha, succesfully connect to the database`);
  }
});

db.serialize(() => {
  const departement = `CREATE TABLE IF NOT EXISTS departement(
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name TEXT NOT NULL,
                      city TEXT
                      )`;

  const employee = `CREATE TABLE IF NOT EXISTS employee(
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    firstName TEXT NOT NULL,
                    lastName TEXT,
                    gender TEXT NOT NULL CHECK (gender IN ('Male', 'Female')),
                    email TEXT NOT NULL UNIQUE ,
                    phone TEXT,
                    dept_id INTEGER,
                    FOREIGN KEY (dept_id) REFERENCES departement(id)
                    )`;
  DATABASE.run(departement);
  DATABASE.run(employee);

  // , err => {
  //   if (err) throw new Erro(`bugs here`);
  //   else console.log("sucess.....");
  // });
});

вы можете видеть оператор else, callback({this.lastID}) когда я комментирую это и удаляю оператор else, создание таблицы было успешным,

но если я снова напишу это выражение else, появится сообщение об ошибке CALLBACK IS NOT FUNCTION но создание таблицы было успешно

значение this.lastId равно способ, которым sqlite3 предоставляет эту информацию, если он помещает поле в объект 'this' в контексте выполнения (SQL, [params], function (err) {this.lastID }) функция обратного вызова ... но только для случаев, когда run вызывается с помощью оператора INSERT. В противном случае, это просто 0 , как сказано в этом уроке https://stackabuse.com/a-sqlite-tutorial-with-node-js/

Вы думаете, что мой обратный вызов неверен?

1 Ответ

0 голосов
/ 17 марта 2019

Проблема в том, как вы написали callback({this.lastID}) измените его на callback(this.lastID) или callback({"lastID" : this.lastID}).

`const DATABASE = require("./setup");
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database("database.db", err => {
  if (err) {
    console.log(`can;t connected tp database, status: ${err}`);
  } else {
    console.log(`gotcha, succesfully connect to the database`);
  }
});
var abc= function(arg){
  console.log(arg);  
};

db.serialize(() => {
  const departement = `CREATE TABLE IF NOT EXISTS departement(
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name TEXT NOT NULL,
                      city TEXT
                      )`;

  const employee = `CREATE TABLE IF NOT EXISTS employee(
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    firstName TEXT NOT NULL,
                    lastName TEXT,
                    gender TEXT NOT NULL CHECK (gender IN ('Male', 'Female')),
                    email TEXT NOT NULL UNIQUE ,
                    phone TEXT,
                    dept_id INTEGER,
                    FOREIGN KEY (dept_id) REFERENCES departement(id)
                    )`;
  DATABASE.run(departement, abc);
  DATABASE.run(employee, abc);

  // , err => {
  //   if (err) throw new Erro(`bugs here`);
  //   else console.log("sucess.....");
  // });
});`

И вы setup.js

const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database("database.db", err => {
  if (err) {
    console.log(`can;t connected tp database, status: ${err}`);
  } else {
    console.log(`gotcha, succesfully connect to the database`);
  }
});

class DATABASE {
  static run(sql, callback) {
    db.run(sql, function(err) {
      if (err) {
        throw err;
        console.log(`something wrong with this ${sql}`);
        console.log(err);
        callback(err);
      } else {
        callback(this.lastID) // this is could be null also
        console.log("sucesfully fo this ", sql);
      }
    });
  }
}

module.exports = DATABASE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...