使用带有nodejs的sqlite3而不使用npm

时间:2016-03-24 17:33:52

标签: javascript node.js sqlite

我只在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注入我已经在努力,这不是我想要回答的问题的一部分。

0 个答案:

没有答案