mongoDB를 데이터베이스로 사용하는 node.js에 간단한 응용 프로그램이 있습니다. 컬렉션에서 하나의 값을 검색하고 데이터를 조정 한 다음 사용자에게 반환하려고합니다.
값을 mongoDB에서 얻은 다음 동적으로 조정하면 디버그 모드에서 새 항목이 유효하고 업데이트 된 값이 유지되는 것을 볼 수 있습니다.
하지만 흐름의 끝에서 뭔가를 호출 한 사람에게 값을 반환하려고 시도 할 때 deferred.resolve(appSettings)
이 제대로 작동하지 않습니다.
저는 무한 루프에 빠지게됩니다. 내가 뭘보고 관리 않은 것은 디버깅 내가 컨트롤러
then(function (item) {
res.Send(item);
})
.catch(function (err) {
res.Status(400).Send(err);
});
지역 (끝없는 루프 전에) 오류를 잡을 관리한다는 것입니다, 그것은 다음과 같은 오류 메시지를 기록하는 동안 - res.Send is not a function
.
코드 :
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 ----
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
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);
});
올바른 호출은 res.Send()가 아니라'res.send()'이며 소문자는's'입니다. Javascript는 대소 문자를 구분합니다. 'res.status()'와 동일합니다. – jfriend00
실제 문제는 제쳐 놓고 분명히 오타입니다. 여기에 외부 약속 라이브러리를 적용하는 이유가 있습니까? 아니면 아주 오래된 블로그 게시물을 읽고 배우는 중입니까? 실제로 의도적으로 그러한 라이브러리의 "엑스트라"를 사용하지 않으면 node.js에 내장 된 약속 지원에서 원하는 모든 것을 얻을 수 있습니다. 물론 실제로 node.js의 "고대"버전을 사용해야 만하는 경우가 있습니다. –
동일한 종류의 쿼리가 mongoskin에도 적용됩니다. 그러한 구현의 이유는 역사적으로 네이티브 드라이버가 제공하지 않는 것을 추가하는 것이 었습니다. 현대적인 드라이버 지원 버전은 "즉시 사용할 수있는"기능을 약속하며 모든 것을 아주 깨끗하게 처리합니다. 꼭 필요한 경우 약속 라이브러리에 대한 자신의 선택을 "플러그인"할 수도 있습니다. 이제는 몽고 스킨과 같은 추상적 개념이 없기 때문에 이러한 것들이 부족합니다. –