[英]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.