2011-05-14 62 views
1

我试图使用db-mysql库从node.js连接到MySQL数据库。一切工作都很好用示例代码,但现在我试图写一个简单的ORM。在node.js中访问MySQL数据库 - 内部断言失败

这是我的代码:

require.paths.unshift('/usr/lib/node_modules'); // default require.paths doesn't include this 

function Model() { 
    this.database = null; 
} 

Model.prototype.getDB = function(callback) { 
    if (this.database != null) 
    callback(this.database); 
    else { 
    console.log("Connecting to database..."); 
    this.database = require("db-mysql").Database({ 
     "hostname" : "localhost", 
     "user"  : "root", 
     "password" : "pass", 
     "database" : "miku", 
    }).on("ready", function() { 
     console.log("Database ready, saving for further use."); 
     this.database = this; 
     callback(this); 
    }); 
    } 
} 

exports.Model = Model; 

而且简单的代码我用来测试:

orm = require('./orm'); 
model = new orm.Model(); 
model.getDB(function (db) { console.log("callback'd"); }); 

它看起来很好(至少对我来说),但Node.js的失败内部断言:

Connecting to database... 
node: /usr/include/node/node_object_wrap.h:61: void node::ObjectWrap::Wrap(v8::Handle<v8::Object>): Assertion `handle->InternalFieldCount() > 0' failed. 
Przerwane (core dumped) 

经过进一步调查,如果在创建数据库对象之前/期间失败。我不知道为什么会发生这种情况。我首先认为这是因为我使用的是git node.js版本,但是当前版本(v0.4.7)也失败了。

我想在node.js代码中找到这个问题,目前没有成功。

回答

3

哦,这是我努力的失败。在JavaScript世界中似乎有Python背景是不受欢迎的;)。

数据库初始化应该是这样的:

db = require("db-mysql"); 
new db.Database({ 
    "hostname" : "localhost", 
    "user"  : "root", 
    "password" : "pass", 
    "database" : "miku", 
}).on("ready", function() { 
    console.log("Database ready, saving for further use."); 
    this.database = this; 
    callback(this); 
}).connect(); 

所以,我基本上忘了打电话给newconnect()

+1

另一个小问题:对象初始值设定项中的尾随逗号(如''database':“miku”,})''虽然有些解释器允许它们滑动但是“正式”非法。最好不要使用它们。 – 2011-05-15 18:45:05

+0

谢谢,我不知道!在这里JavaScript看起来有点奇怪,许多语言都允许它们(我见过很多推荐它们的风格指南)。 – 2011-05-15 18:53:56

+1

当我们终于使用Javascript2时,它们将被允许,但是例如,在包括IE8在内的很多浏览器中,'[1,2,]。length === 3'是真的。参见http://ejohn.org/blog/bug-fixes-in-javascript-2/ – 2011-05-15 19:15:16