如何解决Node.js中MySQL数据库的延迟问题?

时间:2019-03-04 17:40:20

标签: javascript mysql node.js electron mysqljs

因此,我要将基于PHP的应用程序重写为电子应用程序,并且我对node.js还是很陌生。我正在使用mysqljs插件(github:https://github.com/mysqljs/mysql)从MySql数据库(而不是PHP)中收集数据。问题出在这里:

当我尝试从数据库中的表中获取数据时,javscript不会等待数据库将数据从conn()发送回去。

我想将数据放入变量中。但是我不能,因为当我尝试正常运行时,变量“结果”和“ numRows”显示为“未定义”。但是,如果我在调试器模式下运行它,或者将setTimeout()函数的执行延迟约80毫秒,那么它将起作用。

有什么好的解决方法吗?

这是我的完整代码:

/*
 * GLOBAL VARIABLES
 */
var mysql = require("mysql");

var numRows;
var result;

/*
 * CONNECTION SETUP
 */

var connection = mysql.createConnection({
  host      :"localhost",
  user      :"root",
  password  :"",
  database  :"db",
});

function conn(sql) {
  connection.query(sql, (error, results, field) => {
    if (error) {
      return console.error(error.message);
    }
    result = results;
    numRows = results.length;
  })
  return true;
};

/*
 * DATABASE REQUESTS
 */

function createAll() {
  createDB();
  createUserTable();
  createInterestsTable();
  createJunctionTable();
};

function createDB() {
  conn("CREATE DATABASE db");
};

function createUserTable() {
  conn("CREATE TABLE users (ID int UNSIGNED AUTO_INCREMENT primary key, firstName VARCHAR(99), lastName VARCHAR(99), email VARCHAR(99), userName VARCHAR(99), password VARCHAR(99), filter FLOAT, role FLOAT)");
};

function createInterestsTable() {
  conn("CREATE TABLE interests (ID int UNSIGNED AUTO_INCREMENT primary key, name VARCHAR(99))");
};

function createJunctionTable() {
  conn("CREATE TABLE junction (ID int AUTO_INCREMENT primary key,interestID INT UNSIGNED, userID INT UNSIGNED,FOREIGN KEY (interestID) REFERENCES interests(ID),FOREIGN KEY (userID) REFERENCES users(ID))");
};

function deleteDB() {
  conn("DROP DATABASE db");
};

/*
 * FUNCTIONS
 */

function createUser() {

  if(validateForm("register")) {
    var firstName = document.getElementsByName("firstName")[0].value;
    var lastName = document.getElementsByName("lastName")[0].value;
    var email = document.getElementsByName("email")[0].value;
    var userName = document.getElementsByName("userName")[0].value;
    var password = document.getElementsByName("password")[0].value;
    var filter = 1;
    var role = 0;

    if(doesUserExist(userName, email)) {
      conn("INSERT INTO users (`firstName`, `lastname`, `email`, `userName`, `password`, `filter`, `role`) VALUES ('"+firstName+"', '"+lastName+"', '"+email+"', '"+userName+"', '"+password+"', '"+filter+"', '"+role+"')");
      console.log("Registration complete")
    } else {
      console.log("User already exists")
    }
  } else {
    console.log("Registration error")
  }
}

function doesUserExist(userName, email) {
  if(nameCheck(userName)) {
    if(emailCheck(email)) {
      return true;
    } else {
      console.log("Email already in use.")
      return false;
    }
  } else {
    console.log("Username already in use.")
    return false;
  }
}

function nameCheck(userName) {
  // "SELECT * FROM users WHERE userName LIKE '%"+userName+"%'"

  var sql = "SELECT * FROM users WHERE ?? LIKE ?";
  var inserts = ["userName", userName];
  sql = mysql.format(sql, inserts);
  conn(sql);
  delay(100);
  console.log(result);
  console.log(numRows);
  if(numRows > 0) {
    return true;
  } else {
    return false;
  }
}

function emailCheck(email) {
  var sql = "SELECT * FROM users WHERE ? LIKE ??";
  var inserts = ["email", email];
  sql = mysql.format(sql, inserts)
  conn(sql);
  delay(100);
  console.log(result);
  console.log(numRows);
  if(numRows > 0) {
    return true;
  } else {
    return false;
  }
}

function validateForm(form) {
  var fields = ["firstName", "lastName", "email", "userName", "password"]
  var i, l = fields.length;
  var fieldname;

  for (i = 0; i < l; i++) {
    fieldname = fields[i];

    if (document.forms[form][fieldname].value === "") {
      alert(fieldname + " can not be empty");
      return false;
    }
  }
  return true;
}

0 个答案:

没有答案