我只在node.exe上运行nodejs(没有npm)。目前我想以一种不需要任何额外模块的方式将nodejs挂钩到sqlite3现在我找到了一种依赖于sqlite3.exe(sqlite3的命令行界面)和{{3看起来像这样。
var seperators=['##','$$'];
var spawn=require('child_process').spawn;
module.exports=function(file){
if(!file){
file="main.db";
}
var db=spawn(__dirname+'/sqlite3.exe',[file],{cwd:__dirname,stdio:["pipe","pipe","pipe"]});
var database={};
var resolvers=[];
db.stdin.write('.separator '+seperators[0]+' '+seperators[1]+' \n');
db.stdout.on('data',function(data){
data=new Buffer(data);
data=data.toString('utf8');
data=data.split(/\r\n/);
if(data[data.length-1]===''){
data.pop();
}
for(i=0;i<data.length;i++){
if(resolvers.length>0){
var current=resolvers.splice(0,1)[0];
if(current[2]){
data[i]=database.parse(data[i]);
}
current[0](data[i]);
}else{
console.log(data);
}
}
});
db.stderr.on('data',function(data){
data=new Buffer(data);
data=data.toString('utf8');
data=data.split(/\r\n/);
if(data[data.length-1]===''){
data.pop();
}
for(i=0;i<data.length;i++){
if(resolvers.length>0){
console.log(data[i]);
var current=resolvers.splice(0,1)[0];
current[1](data[i]);
}else{
console.log(data);
}
}
})
database.tables=[];
database.getTables=function(){
var promise=new Promise(function(resolve,reject){
db.stdio[0].write(".tables \n");
resolvers.push([resolve,reject,false]);
});
return promise;
};
database.getTables().then(function(data){
data=data.split(/\s+/);
if(data[data.length-1]===''){
data.pop();
}
database.tables=data;
});
database.read=function(table){
var promise=new Promise(function(resolve,reject){
db.stdio[0].write("select * from "+table+";\n");
resolvers.push([resolve,reject,true]);
});
return promise;
};
database.read('tbl1').then(function(data){
data=data.split(/\|/);
if(data[data.length-1]===''){
data.pop();
}
for(i=0;i<data.length;i++){
data[i]=data[i].split(/,/);
}
database.testing=data;
console.log(data);
});
database.store=function(data,table){
if(typeof data==="object"){
}
};
database.parse=function(data){
data=data.split(seperators[1]);
for(i=0;i<data.length;i++){
data[i]=data[i].split(seperators[0]);
}
};
return database;
};
至少这是我到目前为止所拥有的。我担心的是,我不确定sqlite3.exe是否以与调用它们相同的顺序返回进程。如果确实按顺序返回它们,那么这样可以正常工作,但我不确定从哪里开始。有没有人知道这是否会有重大问题?这是不好的做法吗?
此外,我知道sql注入是什么,我将采取措施防止它请不要在你的任何答案中包含sql注入我已经在努力,这不是我想要回答的问题的一部分。