2016-01-25 30 views
0

我已经创建了一个带有sql.js文档的小脚本,但是我无法将缓冲区写入a.db(Win) console给我错误:“未捕获TypeError:必须以数字,缓冲区,数组或字符串开头” 是关于“var data = db.export();”函数还是在我的代码中有错?electron sql.js未捕获TypeError:必须以数字,缓冲区,数组或字符串开头

var fs = require("fs"); 
var remote = require('remote'); 
var SQL = remote.require('sql.js'); 
var file = "a.db" 
var exists = fs.existsSync(file); 

if(!exists) { 
console.log("DB creation: "+file+ ""); 
fs.openSync(file, "w"); 
} 

var filebuffer = fs.readFileSync(file); 

// Load the db 
var db = new SQL.Database(filebuffer); 
// Run a query without reading the results 
db.run("CREATE TABLE test (col1, col2);"); 
// Insert two rows: (1,111) and (2,222) 
db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]); 

var data = db.export(); 
var buffer = new Buffer(data); 
fs.writeFileSync(file, buffer); 

回答

0
var SQL = remote.require('sql.js'); 

你为什么做远程需要在这里? sql.js不是内置的主进程模块,因此没有理由在渲染器进程中不能执行常规的require('sql.js')。您应该非常小心使用remote模块,因为跨进程边界的序列化可能会产生不良副作用(API docs中记录了这些副作用)。

+0

您好, 因为sql.js的stdout错误我使用了远程,但似乎不是正确的方式,所以我用sql-debug.js来代替,如果sql.js和我已经注释掉了这些行和应用程序工作正常: 'if(ENVIRONMENT_IS_WEB && preloadStartTime!== null){ Module.printErr('pre-main prep time:'+(Date.now() - preloadStartTime)+'ms'); }' 当通过双击.exe文件(编译版本)在窗口上执行应用程序时,由于在控制台中写入的行被触发,该行不在Windows上,除非应用程序使用提示 –

+0

你有没有尝试过'process.stdout.write = console.log.bind(console);'需要'sql.js'之前? –

+0

@VadimMacagon我做过'process.stderr.write = console.error.bind(console); process.stdout.write = console.log.bind(console); var SQL = require('sql.js');' 它工作。 (我正在使用Electron。)感谢您的建议! – tjklemz

相关问题