从我的mongo shell中我可以使用db.eval
运行函数,如:
db.eval('return 7;');
但是,对于弃用警告,参数功能正常运行。
现在我想打电话给这样一个'脚本'从node.js
到mongoose
。
我尝试使用字符串化的函数代码作为参数调用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 this或this都没有帮助。
PD1:我愿意这样做,因为我需要调用存储在system.js
到mongoose
的程序。我也做不到。但是,我甚至无法运行像return 5;
这样的愚蠢脚本,因此我之前要求执行更简单的任务。有关如何使用mongoose调用服务器脚本的任何建议都是受欢迎的。
PD2:我意识到mongo中存储的服务器脚本是一种不好的做法,并且由于某种原因而被弃用等等......但我无法做出决定。我被告知要在我公司这样做,并且设置存储服务器脚本原始代码的同事现在不在这里。
答案 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!
})
})