使用Node.js存储JS函数在Mongo DB中出现问题

5

我有一个简单的JS类:

var User = function(id){
    this._id = id;
    this.sayHello = function (){
        return "hello";
    }
}

然后我使用默认的Node.js驱动程序将其存储在MongoDB中:

users.insert(new User(1));

最后,我检索用户并尝试执行该函数:
users.findOne({_id:1}, function(err, item) {
    console.log("Say hello: " + item.sayHello());
});

我收到了以下让人困惑的错误信息:

    throw err;
          ^
TypeError: Object #<Object> has no method 'sayHello'

我对这个问题完全不了解。我原本的理解是MongoDB会将JS函数和属性一并存储。如果这不是情况,你能否推荐一下如何解决这个问题?

谢谢!


你的例子在mongo shell中对我起作用。没有任何错误,sayHello()也被正确调用了。 - zeusdeux
@zeusdeux 这个问题涉及到两个进程:mongodb 和一个独立的 node.js 应用程序服务器进程。mongo shell 是一个开发工具。这个问题是关于在 node.js 中构建应用程序的。 - Peter Lyons
@peter 是的,我明白了。对象方法在存储之前已经被序列化,因此无论是在mongo客户端还是在node应用程序中执行,结果都不应该有所不同。 今天我会尝试在应用程序中执行它,以确保结果。 - zeusdeux
1个回答

9
Mongo无法存储函数(代码),只能存储数据。将您获得的原始数据传递给构造函数,或考虑使用像mongoose这样的ODM。
有一组非常特定且受限制的条件,可以将mongo函数代码以字符串形式发送并在服务器上进行评估。这些在 MongoDB手册中有记录。但是,该代码在mongo内部运行的目的是支持复杂的数据查询操作,而不是模拟应用程序逻辑,这正是这个问题所询问的。应用程序逻辑放在您的node.js模块.js文件中。数据放在数据库中。

1
我同意这次编辑。将应用程序逻辑和它所处理的数据分开。将数据发送到MongoDB,并在你的应用程序中使用模块化的方式来处理应用逻辑。 - zeusdeux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接