Node.js 节点SQLite查询返回未定义的
我的问题很简单:我有3种方法:Node.js 节点SQLite查询返回未定义的,node.js,typescript,sqlite,Node.js,Typescript,Sqlite,我的问题很简单:我有3种方法: 导出函数F\u SetupDatabase(\u logger:any):void 导出函数Q\u RunQuery(查询:字符串,db:“session”|“global”):any 导出函数Q_RunQueryWithParams(查询:string,参数:string[],db:“session”|“global”):any 访问数据库文件(SQLite3)。 (调用顺序:F\u SetupDatabase(…)->Q\u RunQuery(…)) F_
导出函数F\u SetupDatabase(\u logger:any):void
导出函数Q\u RunQuery(查询:字符串,db:“session”|“global”):any
导出函数Q_RunQueryWithParams(查询:string,参数:string[],db:“session”|“global”):any
F\u SetupDatabase(…)
->Q\u RunQuery(…)
)
F_SetupDatabase(…)
用于打开数据库文件global Database.db
,并创建另一个内存数据库会话。我的主要问题是,在我的应用程序的主功能中,来自Q_RunQuery
的日志显示在F_SetupDatabase
之前。查询也不起作用,总是返回未定义的。所以我想这与异步/同步调用或类似的东西有关。
我试图完全避免异步调用/方法,因为我缺乏经验,总是挂断自己的电话。
SQL查询是正确的
数据库.ts的完整源代码
/**
*文件:database/database.ts
*描述:数据库管理器
*作者:奥利弗·卡格
*/
从“sqlite3”导入*作为sqlite;
从“粉笔”导入粉笔;
//可用于此文件之外的其他方法
导出var sessionDatabase:sqlite.Database;
导出var数据库:sqlite.database;
//信号记录器
var记录器:任何;
/**
*@description创建/连接数据库并在内存中设置会话数据库`
*@作者奥利弗·卡格
*@param{any}\u记录器信号记录器
*/
导出函数F_SetupDatabase(_logger:any):void{
logger=_logger.scope('Database');
//在内存中打开数据库
sessionDatabase=new sqlite.Database(
“:内存:”,
函数(err:any):void{
如果(错误){
logger.fatal(新错误(err));
}
logger.success('在内存中打开会话数据库!');
}
);
//内存数据库中的设置
//注意:不需要自动递增,列:int主键将自动递增
// https://stackoverflow.com/questions/24600375/syntax-error-near-autoincrement-with-sqlite-database-creation
常量setupSessionDatabaseQuery:字符串=`
创建表会话(
sessionID int unique,
clientID varchar(25)不为空,
主键(sessionID)
);`
run(setupSessionDatabaseQuery,[],函数(err:any){
if(err)logger.fatal(新错误(err));
logger.success(“内存会话数据库设置完成!”)
});
//打开数据库文件
database=new sqlite.database(
“./database/global database.db”,sqlite.OPEN\u READWRITE,
函数(err:any):void{
如果(错误){
logger.fatal(新错误(err));
}
logger.success('打开的数据库文件!');
}
);
}
/**
*@description不带参数运行查询
*@作者奥利弗·卡格
*@param{string}query SQL查询
*@param{“session”|“database”}db在哪个数据库上执行查询
*/
导出函数Q|u RunQuery(查询:字符串,db:“session”|“global”):任意{
logger.info(“SQL查询:用于:“+chalk.bold(db))
如果(db==“全局”){
database.serialize(函数(){
database.all(查询,[],函数(err:any,rows:any){
如果(错误){
logger.fatal(新错误(err));
}
返回行;
});
});
}else if(db==“会话”){
sessionDatabase.serialize(函数(){
sessionDatabase.all(查询,[],函数(err:any,rows:any){
如果(错误){
logger.fatal(新错误(err));
}
返回行;
});
});
}
}
/**
*@description使用参数运行查询
*@作者奥利弗·卡格
*@param{string}query SQL查询
*@param{string[]}params SQL查询参数
*@param{“session”|“database”}db在哪个数据库上执行查询
*/
导出函数Q_RunQueryWithParams(查询:字符串,参数:字符串[],db:“会话”|“全局”):任意{
logger.info(“SQL查询:用于:“+chalk.bold(db))
如果(db==“全局”){
const data=database.serialize(函数(){
database.all(查询、参数、函数(err:any、rows:any){
如果(错误){
logger.fatal(新错误(err));
}
返回行;
});
});
}else if(db==“会话”){
返回sessionDatabase.serialize(函数(){
sessionDatabase.all(查询、参数、函数(err:any、rows:any){
如果(错误){
logger.fatal(新错误(err));
}
返回行;
});
});
}
}
main.ts
导出函数F_Start(enableLogger?:布尔):http.Server{
如果(启用记录器===真){
logger.enable();
}else if(enableLogger==false){
logger.disable();
}否则{
logger.enable();
}
console.clear();
F_SkynetLogo();
F_EnableMiddleware(skynetApi、记录器);
F_设置路由(skynetApi、记录器);
F_设置数据库(记录器);
skynetServer=F_ServerListener(skynetApi,记录器);
Q_RunQuery(`INSERT-INTO-sessions(clientID)值(“client-1-0-0”)`,“session”);
//获取会话(clientID)
const session=Q_RunQuery(`SELECT*FROM sessions`,“session”);
console.log(会话);
返回skynetServer;
}
从控制台记录
[Database] › ℹ info SQL Query: <INSERT INTO sessions (clientID) VALUES ("client-1-0-0")> for: session
[Database] › ℹ info SQL Query: <SELECT * FROM sessions> for: session
undefined
[Server] › ▶ start Instance available on: 127.0.0.1:3000
[Database] › ✔ success Opened in-Memory Session Database!
[Database] › ✔ success Opened Database File!
[Database] › ✔ success Setup of in-Memory Session Database complete!
[数据库]›ℹ 信息SQL查询:用于:会话
[数据库]›ℹ 信息SQL查询:用于:会话
未定义
[服务器]›▶ 开始实例的可用时间:127.0.0.1:3000
[数据库]›✔ 成功打开内存会话数据库!
[数据库]›✔ 成功打开数据
/**
* @description Run Query without Params
* @author Oliver Karger <kmaster@oliver-karger.de>
* @param {string} query SQL Query
* @param {"session" | "database"} db On which Database to execute the Query
*/
export function Q_RunQuery(query: string, db: "session" | "global", callback: CallableFunction): any {
logger.info("SQL Query: <" + chalk.bold(query) + "> for: " + chalk.bold(db))
if(db === "global") {
database.serialize(function() {
database.all(query, [], function(err: any, rows: any) {
if(err){
callback(err);
}
callback(null, rows);
});
});
} else if(db === "session"){
sessionDatabase.serialize(function() {
sessionDatabase.all(query, [], function(err: any, rows: any) {
if(err){
callback(err);
}
callback(null, rows);
});
});
}
}
Q_RunQuery(`SELECT * FROM sessions`, "session", (err, data) => {
if (err) {
console.error(err);
return;
}
console.log('Result, - ', data);
});
export function Q_RunQuery<T>(query: string, db: "session" | "global"): Promise<T> {
logger.info("SQL Query: <" + chalk.bold(query) + "> for: " + chalk.bold(db))
if(db === "global") {
return new Promise((res, rej) => {
database.serialize(function() {
database.all(query, [], function(err: any, rows: any) {
if(err){
rej(err);
}
res(rows);
});
});
})
} else if(db === "session"){
// Some thing here...
}
}