如何从猫鼬顺序检索数据?

时间:2017-05-28 10:58:22

标签: javascript node.js mongodb mongoose mongoose-schema

get: function (code) {
    console.log('Retrieving model for code : ', code);
    let database = UTILS.getDatabase('databaseName');
    return database.models.modelName.find({})
        .then(function (users) {
            console.log(' ----------- ', users);
            return users;
        })
        .catch(function (error) {
            return '{success: "false", msg: "Error found : ' + error + '"}';
        });
}

此代码运行时没有任何错误,但调用“get”的函数找不到任何记录,而回调函数在控制台中打印大约8-9条记录。我知道这是回调功能,但我需要按顺序发生。

我还尝试将yield return yield database.models.modelName.find({})*函数一起使用,但获取{},这是一个空对象。

请建议一种避免回调并从mongodb获取数据的方法。

谢谢Julien,但是我不能使用回调,因为调用“get”的函数有逻辑来处理从mongoose返回的对象。

嗨Ravi,这里是这个进程堆栈的完整流程。路线 - >控制器 - >门面 - >服务 - > Dao(我发布的代码属于Dao图层获取功能)

这看起来是典型的类型语言解决方案,但我需要这样做。

服务层功能可以从多个模型中收集数据并且可以集体处理,因此回调过程不符合我的要求。

我完全陷入困境,感谢您的帮助:)

路由器:

app.route('/nodics/users')
.get(CONTROLLER.UserController.get)
.post(CONTROLLER.UserController.set);   

控制器:

get: function (request, response, error) {      
    let users = FACADE.UserFacade.get();
    response.json(users);
}

立面:

get: function (code) {
    console.log('inside Facade call....', code);
    return SERVICE.UserService.get(code);
}

服务:

get: function (code) {
    console.log('inside Service call....', code);
    return DAO.UserDao.get(code);
}
道方法已经存在于顶层。这是一个示例分层实现。但我只想以这种方式实施。这样我就可以随时随地在服务层的任何地方调用DAO层方法。

用例:

1. I want to add one item into cart, so I pass, PID, SKUID and quantity to the router, which simply pass controls to controller.
2. Controller pass it to facade and Service.
3. In service layer
     1. Call another service to check if quantity is valid
     2. Call DAO to load product item
     3. Call another DAO to load Inventory (or use from first call)
     4. Call another DAO to load price item, based on local and currency, or other parameters.
     5. Finally load ORDER and add this item into it and save it
     6. Return order item to facade layer
4. In Facade, apply filter to return only fields required to expose as service.

所以如果我想实现这个用例,那么从mongoose回调获取数据将无济于事。

所以请建议我直接从mongoose获取数据而不使用回调。

1 个答案:

答案 0 :(得分:0)

您需要将回调传递给您的函数并从您的承诺中调用它:

get: function (code, cb) {
    console.log('Retrieving model for code : ', code);
    let database = UTILS.getDatabase('databaseName');
    return database.models.modelName.find({})
        .then(function (users) {
            console.log(' ----------- ', users);
            cb(users);
        })
        .catch(function (error) {
            cb({success: "false", msg: "Error found : ' + error + '"});
        });
}