Node.js 在连接启动时调用db.loadServerScripts

Node.js 在连接启动时调用db.loadServerScripts,node.js,mongodb,Node.js,Mongodb,我在system.js集合中有一些,然后在node.js中使用。然而,有时它们是未定义的 以下是场景: 我在服务器启动时加载这些函数一次: db.eval('db.loadServerScripts()', function(err, result) { ... }); 因此,在启动时只调用一次,而不是针对每个请求 从现在起,我可以打电话,例如: db.eval('getNextSequence(\'test\')', function(err, seq){}); 但有时我会得到一个错

我在system.js集合中有一些,然后在node.js中使用。然而,有时它们是未定义的

以下是场景: 我在服务器启动时加载这些函数一次:

db.eval('db.loadServerScripts()', function(err, result) { ... });   
因此,在启动时只调用一次,而不是针对每个请求

从现在起,我可以打电话,例如:

db.eval('getNextSequence(\'test\')', function(err, seq){});
但有时我会得到一个错误,getNextSequence是未定义的。我怀疑这些函数只存在于当前连接范围中。因此,当节点接收到新连接时,可能没有设置函数

有没有办法在node.js中使用这些函数,但让它们始终可靠地可用


示例场景:

//1./ this function is stored in system.js
getNextSequence: function(name) 
{
    var ret = db.counters.findAndModify({
        query: { _id: name },
        update: { $inc: { seq: 1 } },
        new: true,
        upsert: true
    });
    return ret ? ret.seq : null;
}

//2./ this is called on nodejs server startup (once for server lifetime)
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/mydb", {native_parser:true});
//...
db.eval('db.loadServerScripts()', function(err, result) {
    //...crash if failed
}); 

//3./ this is used in node.js code, on request processing:
db.eval('getNextSequence(\'someNamespace\')', function(err, seq){
    // int seq is converted to string slug
    // a new entity with slugId is saved to collection
});

你能澄清一下你是如何使用这些功能的吗?将函数从
system.js
集合加载到mongo shell中。要在服务器端使用它们,例如在
db.eval
中,您根本不需要调用
db.loadServerScripts
。我认为这只是一个shell函数,但您正在讨论在Node中使用它,您能澄清一下吗?您是使用shell还是节点驱动程序与MongoDB进行交互?wdberkeley:感谢您的反应,我尝试重新表述这个问题。
db.loadServerScripts
用于将服务器端js加载到当前MongoShell会话中。我认为在
db.eval
中调用它是没有意义的
system.js
函数无论如何都应该在eval中定义。未定义错误的最可能原因是函数超出范围,因为您的
db.eval
正在另一个数据库上运行。还有,node!=蒙戈贝壳。您正在使用mongo shell或node?我理解您的观点。在这个场景中,我只使用node.js,不使用mongoshell。这些函数保存在system.js集合中,并在服务器启动时由node.js通过db.eval('db.loadServerScripts(),…)加载。然后我有十分之一的成功请求,它们正在使用这些函数,直到最后一个请求由于未定义的函数调用而失败。我认为,这些函数是在连接作用域中加载的,当连接终止并且节点接收到一个新的连接时,它就会失败。因此,我正在寻找一种方法来初始化每个新连接(如果我的gues是正确的话)。我不希望在每个请求中调用db.eval('db.loadServerScripts(),…),因为这是一种高负载服务,我正在尝试尽可能少地调用db。