简体   繁体   English

承诺与node.js和$ q

[英]Promises with node.js and $q

I got a simple app in node.js with mongoDB as the database. 我在mongoDB作为数据库的node.js中有一个简单的应用程序。 I am trying to retrive one value from a collection, then do some adjustments to the data and then return it to the user. 我试图从集合中检索一个值,然后对数据进行一些调整,然后将其返回给用户。

I retrive the value from mongoDB, then i adjust it dynamically and i am able to see in debug mode that the new item is valid and holds the updated values. 我从mongoDB中检索了该值,然后进行了动态调整,并且可以在调试模式下看到该新项有效并保存了更新后的值。

But at the end of the flow when i am trying to return the value to the caller of the request something with the deferred.resolve(appSettings) aint working right. 但是在流程的最后,当我尝试将值返回给请求的调用者时,使用了deferred.resolve(appSettings) aint可以正常工作。

I am being put into an endless loop. 我陷入无休止的循环。 What i did manage to see while debugging is that i managed to catch an error (before the endless loop) in the controller 我在调试时确实看到的是,我设法在控制器中捕获了一个错误(在无尽循环之前)

then(function (item) {
                res.Send(item);
            })
            .catch(function (err) {
                res.Status(400).Send(err);
            });

area, and it writes the following error message - res.Send is not a function . 区域,并写入以下错误消息res.Send is not a function

The code : 编码 :

uiSettings.service.js -- uiSettings.service.js-

var config = require('config.json');
var dateUtil = require('date-and-time')
var Q = require('q');
var mongo = require('mongoskin');
var db = mongo.db(config.connectionString, { native_parser: true });
db.bind('UiAppSettings');

var service = {};

service.getOneByMappingType = getOneByMappingType

module.exports = service;

function getOneByMappingType(mappingType){
    var deferred = Q.defer();

    db.UiAppSettings.findOne(
        { MappingType: mappingType},
        function (err, appSettings){
            if (err) deferred.reject(err.name + ': ' + err.message);

            if(appSettings)
                adjustDates(appSettings);

            deferred.resolve(appSettings);

        });

        function adjustDates(appSettings){
            var defaultDates = appSettings.UiSettingsMap.FilterObject.Time.Defaults;
            for (var i=0; i< defaultDates.length; i++)
            {
                var startDate = calculateDate(defaultDates[i].StartDefaultsDate);
                var endDate = calculateDate(defaultDates[i].EndDefaultsDate);
                appSettings.UiSettingsMap.FilterObject.Time.Defaults[i].startDate = startDate;
                appSettings.UiSettingsMap.FilterObject.Time.Defaults[i].endDate = endDate;
            }
            appSettings.UiSettingsMap.FilterObject.Time.Selected.startDate = appSettings.UiSettingsMap.FilterObject.Time.Defaults[0].startDate;
            appSettings.UiSettingsMap.FilterObject.Time.Selected.endDate = appSettings.UiSettingsMap.FilterObject.Time.Defaults[0].endDate;

        }

        function calculateDate(dateData){
            let currDate = new Date();
            currDate = dateUtil.addYears(currDate, dateData.Year);
            currDate = dateUtil.addMonths(currDate, dateData.Month);
            currDate = dateUtil.addDays(currDate, dateData.Day);
            return currDate;
        }

    return deferred.promise;
}

uiSettings.controller.js ---- uiSettings.controller.js ----

var config = require('config.json');
var express = require('express');
var router = express.Router();
var uiService = require('services/uiSettings.service');

// routes
router.get('/:mappingType', getOneByMappingType)


module.exports = router;


function getOneByMappingType(req, res){
    uiService.getOneByMappingType(req.params.mappingType)
        .then(function (item) {
            res.Send(item);
        })
        .catch(function (err) {
            res.Status(400).Send(err);
        });
}

---- server.js ---- server.js

require('rootpath')();
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var expressJwt = require('express-jwt');
var config = require('config.json');

app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());


// routes
app.use('/settings', require('./controllers/uiSettings.controller'));

// start server
var port = process.env.NODE_ENV === 'production' ? 80 : 4000;
var server = app.listen(port, function () {
    console.log('Server listening on port ' + port);
});

As jfriend00 commented the problem was caused by case sensitive usage of Send instead of send. 正如jfriend00所评论的那样,此问题是由区分大小写使用Send(而不是send)引起的。

I also took Neil's advice and made many changes to use the built in native Promise and the native mongo driver instead. 我还听取了尼尔(Neil)的建议,进行了许多更改,以使用内置的本地Promise和本地的mongo驱动程序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM