【问题标题】:Timing of query with mongoose and nodemongoose 和 node 查询的时机
【发布时间】:2016-08-17 19:49:25
【问题描述】:

我对这个问题完全绝望。我有一个查询数组,我在内存中存储了很长时间。有了它,我调用一个 API,触发我的请求并将结果存储到 MongoDB……没问题。不幸的是我没有控制注册。 API-Server 和一些 Econnet/TCP/IP 连接错误使我的应用程序不时崩溃。

为了能够继续我的查询任务,我在我的 MonogDB 中编写了所有查询,并且我想跟踪/记录每个正在执行的查询的 queryState。

当我尝试从 Mongo 将查询返回到触发请求的方法中时,就会出现问题。由于一些时间/异步问题(我猜),我的 queryArray 一直未定义,我没有得到解决...

server.js:

//TEST
var querymongo = require('./config/queryMongo');
var queryobject = new querymongo;
var queryArray = queryobject.results();

queryArray 一直未定义...

queryMongo.js:

    //require mongo model + db connection
    var queryDB = require('./queryDB');

    //constructor
    ...

    //mongoRequest method
        this.mongoRequest = function(){
            console.log("Function mongoRequest called now!");
            return new Promise(function(resolve, reject){
                queryDB.queries.find({'SearchIndex': 'All'}, function(err, doc){
                    if(err) return reject (err)
                    else resolve (doc)
                });
            });
        }

    //resolve results
    this.results = function(){
        var queryArray = [];
        this.mongoRequest().then(function(doc, err){
             console.log(doc)
            queryArray = doc;
            return queryArray;
        }).catch(function(err){
            console.log(err)
            });
        }



}
module.exports = QueryMongo;

结果方法中的 console.log(doc) 有效,但在所有正在执行的代码结束时返回所有文档。这里有什么问题?

我会非常感激,因为这让我发疯了!

谢谢

胡乔

【问题讨论】:

  • 我认为你应该在 results 函数中返回一个承诺或回调。因为您的QueryMongo 是异步的,所以您不应该将其用作同步函数
  • 这正是问题所在。我通过代码一步一步地调试,问题出在我的结果函数中的“then”。回调。它再次异步运行......另一个承诺?

标签: javascript node.js asynchronous mongoose promise


【解决方案1】:

所以你的问题是为什么 queryArray 是未定义的?

因为 Mongo 查询是异步的,并且您在之后执行 console.log,也就是说,在您获得结果之前。

//resolve results
this.results = function(){
    var queryArray = [];
    this.mongoRequest().then(function(doc, err){
     //////// DO SOMETHING WITH THE RESULT HERE
    }).catch(function(err){
        console.log(err)
        });
    }

【讨论】:

  • 最后我自己解决了,效果很好...如果有人有兴趣我可以发布代码...
猜你喜欢
  • 2015-11-08
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多