因此,我要将基于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;
}