2012-01-26 28 views
3

我正在使用Cradle从我的Node.js服务器存储CouchDB中的对象。该对象包含功能....如何在从CouchDB检索的文档上调用函数?

function AnObject(a, b){ 
this.a = a; this.b = b; 
this.addparts = function(){return this.a + this.b;};} 

var cradle = require('cradle'); 
var db = new(cradle.Connection)('http://localhost', 5984, {cache: true, raw: false}).database('myDB'); 

var myObject = new AnObject(1, 2); 
console.log("addparts:" + myObject.addparts()); 
db.save('myObjectId', myObject); 

这工作得很好,并存储文档,但是当我找回它,我不能再呼吁返回的文档的功能...

db.get('myObjectId', function(err, myRetrievedObject){ 
console.log("addparts:" + myRetrievedObject.addparts()); 
}); 

(Property不是函数)Error失败。

node cradle_test 

cradle_test.js:21 
console.log("addparts:" + myRetrievedObject.addparts()); 
             ^
TypeError: Property 'addparts' of object {"_id":"myObjectId","_rev":"2-83535db5101fedfe30a1548fa2641f29","a":1,"b":2,"addparts":"function(){return this.a + this.b;}"} is not a function 
+0

我会很有趣的有一个模块,可以保存函数引用的分贝,你可以打电话给他们检索他们。像dnode这样的事情。 – fent

回答

2

CouchDB存储JSON。函数不是有效的JSON。函数永远不会存储在数据库中。

我建议你将函数移出原型。

function AnObject(a, b){ 
    this.a = a; this.b = b; 
} 

AnObject.prototype.addparts = function(){ 
    return this.a + this.b; 
}; 

db.get('myObjectId', function(err, myRetrievedObject){ 
    var obj = Object.create(AnObject.prototype); 
    // for some value of extend (https://github.com/Raynos/pd#pd.extend) 
    extend(obj, myRetrievedObject); 
    console.log("addparts:" + obj.addparts()); 
}); 

这种方式你不保存的功能,你仍然可以使用你的方法操作你的对象。您只需确保将您检索到的对象作为AnObject的实例

+0

谢谢雷,这是答案,不幸的是我无法让你的模块工作,所以我最终下载和./要求这个文件,而不是'扩展'功能... https://raw.github.com /DracoBlue/spludo/master/core/util.js –

+0

@MichaelDausmann你能突出它的哪部分不起作用吗?如果您打开pd的错误报告,我会解决它。 – Raynos

0

有一种方法可以将函数存储在CouchDB中:作为附件

在单独的.js文件中定义您的函数 (例如,您希望在多个服务器或应用程序实例中共享的一组函数)。

/modules/db.js:

var db = {} 

db.insert = function(nanoDb, object, cb){ 
    //insert new doc 
    nanoDb.insert(object, function(err, body, header) { 
    if (!err) { 
     cb.call(null, {success: true, data: body}); 

    }else{ 
     console.log('[insert] ', err.message); 
     cb.call(null, {success: false, error: err.message}); 
    } 
    }); 
} 

db.bulkInsert = function(nanoDb, array, cb){ 
    //structure for bulk insert 
    var data = { 
    docs: array 
    } 
    //insert new doc 
    nanoDb.bulk(data, function(err, body, header) { 
    if (!err) { 
     cb.call(null, {success: true, data: body}); 

    }else{ 
     console.log('[bulkInsert] ', err.message); 
     cb.call(null, {success: false, error: err.message}); 
    } 
    }); 
} 

db.bulkDelete = function(nanoDb, array, cb){ 
    for(i in array){ 
    array[i]._deleted = true; 
    } 
    var data = { 
    docs: array 
    } 
    //check if the url exists in the db 
    nanoDb.bulk(data, function(err, body) { 
    if (!err){ 
     cb.call(null, {success: true, data: data}); 
    }else{ 
     console.log('[bulkDelete] ', err.message); 
     cb.call(null, {success: false, error: err.message}); 
    } 
    }); 
} 

db.view = function(nanoDb, design, view, params, cb){ 
    nanoDb.view(design, view, params, function(err, body) { 
    if (!err){ 
     var docs = util.extractDocs(body); 
     cb.call(null, {success: true, data: docs}); 
    }else{ 
     console.log('[view] ', err.message); 
     cb.call(null, {success: false, error: err.message}); 
    } 
    }); 
} 

db.search = function(nanoDb, design, index, params, cb){ 
    nanoDb.search(design, index, params, function(err, body) { 
    if (!err) { 
     var docs = util.extractDocsSearch(body); 
     cb.call(null, {success: true, data: docs}); 
    }else{ 
     console.log('[search] ', err.message); 
     cb.call(null, {success: false, error: err.message}); 
    } 
    }); 
} 

db.follow = function(nanoDb, params){ 
    var feed = nanoDb.follow(params); 
    return feed; 
} 

module.exports = db; 

使用CouchApp部署的功能附件(在设计文档):

//your couchapp 
var couchapp = require('couchapp') 

//url to your database 
var url = '...'; 

//empty design doc (for attachments) 
ddoc = { 
    _id: '_design/mods' 
}; 

//folder containing .js files 
couchapp.loadAttachments(ddoc, './modules/'); 

//this function uploads your attachments 
couchapp.createApp(ddoc, url, function(app) { 
    app.push(function(){ 
    //do something 
    }); 
}); 

现在,得到了功能,无论你需要他们:

//use mikaels request module if you like 
var request = require('request'); 

//tell the app where to get your .js file 
//sometimes a good idea to persist these references in memory or even in your couchdb 
var fileUrl = '/_design/modules/db.js' 

//set this variable in the proper scope 
var db; 

//we'll use this to 'require' the .js file 
var _require = function(src, file) { 
    var m = new module.constructor(); 
    m.paths = module.paths; 
    m._compile(src, file); 
    return m.exports; 
} 

request({ url: fileUrl, json: true }, function (err, response, data) { 
    if (!err && response.statusCode === 200) { 
    //now we assign our required .js file (object w/functions) back into usable form 
    //woot woot! 
    db = _require(data); 
    }else{ 
    console.log('[request]', err); 
    } 
}); 

做东西!

db.doSomething()