如何通过Mongoose

时间:2017-10-23 10:47:45

标签: node.js mongodb mongoose

从我的mongo shell中我可以使用db.eval运行函数,如:

db.eval('return 7;');

但是,对于弃用警告,参数功能正常运行。

现在我想打电话给这样一个'脚本'从node.jsmongoose

我尝试使用字符串化的函数代码作为参数调用db.eval(作为in here):

mongoose.connect(PATH_TO_A_MONGO_DATABASE);
mongoose.connection.db.eval('return 9;', function(err, result){
    console.log(result);
    //etc.
}); 

这默默地忽略了回调。不会抛出任何错误,并且永远不会调用回调函数。

执行此操作时,我检查mongoose.connection.db.eval实际上是一个函数。

由于db.eval也有Promise接口,所以也尝试过:

mongoose.connection.db.eval('return 5;').then(console.log).catch(console.log);

结果相同:没有错误,只是沉默。

所以,我想我错过了一些语法,但我无法找到有关此问题的文档或示例。任何类似的问题like thisthis都没有帮助。

PD1:我愿意这样做,因为我需要调用存储在system.jsmongoose的程序。我也做不到。但是,我甚至无法运行像return 5;这样的愚蠢脚本,因此我之前要求执行更简单的任务。有关如何使用mongoose调用服务器脚本的任何建议都是受欢迎的。

PD2:我意识到mongo中存储的服务器脚本是一种不好的做法,并且由于某种原因而被弃用等等......但我无法做出决定。我被告知要在我公司这样做,并且设置存储服务器脚本原始代码的同事现在不在这里。

1 个答案:

答案 0 :(得分:0)

好的,我弄清楚为什么我的db.eval回调被忽略了。它与猫鼬连接有关。

如果你开始连接:

const conn = mongoose.connect(PATH_TO_DB);

然后进行查询:

conn.model(a_collection, a_schema).find({}).exec().then()...

即使您只是在连接之后立即调用查询-it,逻辑上是一个异步进程,mongooose认为它必须等待连接处于正确状态,然后触发查询,然后调用回调查询结果。

但是,这与db.eval()的工作方式不同。只是在调用连接后尝试调用db.eval(),回调会被忽略:

const conn = mongoose.connect(PATH_TO_DB);
conn.db.eval('return 5;', (err, response) => {
    //nothing happends
})

这就是我创建连接并调用db.eval的方式,因此我无法让db.eval()工作。

为了触发db.eval并使其正常工作,您似乎需要明确等待连接:

const conn = mongoose.connect(PATH_TO_DB, err => {
    mongoose.connection.db.eval('return 5', (err, result) => {
         result; //5!
    })
});

在调用db.eval的任何尝试也起作用之前进行查询:

const conn = mongoose.connect(PATH_TO_DB);
conn.model(a_collection, a_schema).find({}).exec()
.then(() => {
    conn.db.eval('return 5', (err, result) => {
         result; //5!
    })
})