我们正在开发一个通用应用程序,必须在任何浏览器中在移动设备(ios,android),桌面(windows,mac,linux)上执行。
对于客户端数据库管理,我们希望使用sqlite3 - 用于桌面 - 在这种情况下,应用程序将使用Electron(Atom shell)打包。我们使用的模块捆绑器是webpack,因为该应用程序是使用Ionic 2和Angular2开发的。
我们已经安装了sqlite3作为项目依赖项,node-pre-gyp为平台生成二进制文件(在这种情况下,我们使用Windows 7 64位进行测试)
我们有一个Sqlite3的提供者,这是代码:
import * as sqlite3 from 'sqlite3';
import { IDatabaseProvider } from './database.provider';
export class Sqlite3DatabaseProvider implements IDatabaseProvider {
private _storage;
constructor() {
console.log('Initializing Sqlite3 Database Provider');
}
openDatabase() {
this._storage = new sqlite3.Database('v2App_sqlite3.db');
}
}
正如您所注意到的那样,创建数据库的行被注释,因为应用程序正常工作。如果我取消注释该行,则会出现此错误:
Runtime Error
Cannot read property '_handle' of undefined
TypeError: Cannot read property '_handle' of undefined
at http://localhost:8100/build/main.js:210758:15
at Array.forEach (native)
at module.exports (http://localhost:8100/build/main.js:210757:36)
at Object.<anonymous> (http://localhost:8100/build/main.js:12580:1)
at Object.<anonymous> (http://localhost:8100/build/main.js:12873:30)
at __webpack_require__ (http://localhost:8100/build/main.js:20:30)
at Object.<anonymous> (http://localhost:8100/build/main.js:69457:11)
at Object.<anonymous> (http://localhost:8100/build/main.js:69638:30)
at __webpack_require__ (http://localhost:8100/build/main.js:20:30)
at Object.<anonymous> (http://localhost:8100/build/main.js:211548:72)
好奇的是,它在这里失败了,在set-blocking npm模块的代码中:
module.exports = function (blocking) {
[process.stdout, process.stderr].forEach(function (stream) {
if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {
stream._handle.setBlocking(blocking)
}
})
}
当流未定义时,获取_handle属性会产生错误。
但只有在我添加创建sqlite3数据库的行时才会执行此代码:
this._storage = new sqlite3.Database('v2App_sqlite3.db');
这个模块(set-blocking)和sqlite3之间有什么关系?为什么在尝试创建sqlite3数据库时未定义流?
可能使用Node的outputStream生成一个文件 - 数据库 - 但仍然无法创建该对象 - 流。
任何帮助?
提前致谢