2017-11-10 4 views
0

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); 
}); 
+0

올바른 호출은 res.Send()가 아니라'res.send()'이며 소문자는's'입니다. Javascript는 대소 문자를 구분합니다. 'res.status()'와 동일합니다. – jfriend00

+0

실제 문제는 제쳐 놓고 분명히 오타입니다. 여기에 외부 약속 라이브러리를 적용하는 이유가 있습니까? 아니면 아주 오래된 블로그 게시물을 읽고 배우는 중입니까? 실제로 의도적으로 그러한 라이브러리의 "엑스트라"를 사용하지 않으면 node.js에 내장 된 약속 지원에서 원하는 모든 것을 얻을 수 있습니다. 물론 실제로 node.js의 "고대"버전을 사용해야 만하는 경우가 있습니다. –

+0

동일한 종류의 쿼리가 mongoskin에도 적용됩니다. 그러한 구현의 이유는 역사적으로 네이티브 드라이버가 제공하지 않는 것을 추가하는 것이 었습니다. 현대적인 드라이버 지원 버전은 "즉시 사용할 수있는"기능을 약속하며 모든 것을 아주 깨끗하게 처리합니다. 꼭 필요한 경우 약속 라이브러리에 대한 자신의 선택을 "플러그인"할 수도 있습니다. 이제는 몽고 스킨과 같은 추상적 개념이 없기 때문에 이러한 것들이 부족합니다. –

답변

0

jfriend00이 (가) 문제를 언급했기 때문에 Send 대신 Send를 대소 문자를 구분하여 사용했기 때문입니다.

나는 또한 Neil의 충고를 받아 들여 내장 된 Promise 및 기본 mongo 드라이버를 대신 사용하여 많은 변경 작업을 수행했습니다.