2016-12-20 2 views
0

Express 및 q promise 라이브러리 (Winston은 로깅 용, restler는 http 요청 용)를 사용하여 응용 프로그램을 빌드하고 있습니다..catch 내의 Express Error Handler를 통한 예외 처리

달성하고자하는 것은 : 코드가 비동기 오류를 발생시키고 catch 절에 의해 캡처되면 해당 오류를 Express 오류 처리기에서 처리하도록합니다.

코드를 작성했지만 위의 시나리오를 수행 할 때 앱이 중단됩니다. self.index에 catch 절이 표시됩니다.

업데이트 : idbehold 제안 사항에 따라 self.index를 업데이트했습니다. 아직 작동하지 않습니다.

도움이 될 것입니다. 미리 감사드립니다.

index.controller.js

"use strict" 

let Q = require("q"), 
    restConnector = require("restler"), 
    winston = require("winston"), 
    logger = new winston.Logger({ 
     level: 'info', 
     transports: [ 
      new winston.transports.Console(), 
      new winston.transports.File({ filename: 'log.log' }) 
     ], 
     exitOnError : false 
    }), 
    self = {}; 

self.get = function(url, options) { 
    let deferred = Q.defer(); 
    let opts = (options||{}) 
    opts.timeout = opts.timeout || 500 

    logger.info("url: " + url); 



    restConnector.get(url, opts) 

     .on('success', (response) => { 
      deferred.resolve(response); 
     }) 
     .on('fail', (err) => {logger.info("fail"); deferred.reject(err)}) 
     .on('error', (err) => {logger.info("error"); deferred.reject(err)}) 
     .on('timeout', (err) => {logger.info("timeout"); deferred.reject(err)}); 

    return deferred.promise; 
}; 

//UPDATE: idbehold 
self.index = (req, res, next) => { 

    logger.info("Logging info"); 

    return self.get("http://api2-ci.example.com/post/5854346").then((cart) => { 
      logger.log("info", "log", cart); 
      res.render('index', { title: 'Express from Controller' }); 
     }).catch(next); 

} 

module.exports = self; 

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var index = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'hbs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(require('node-sass-middleware')({ 
    src: path.join(__dirname, 'public'), 
    dest: path.join(__dirname, 'public'), 
    indentedSyntax: true, 
    sourceMap: true 
})); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', index); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 

    next(err); 
}); 

module.exports = app; 

하는 index.js (경로)

let express = require('express'); 
let router = express.Router(); 
let indexCtrl = require('../controllers/index.controller'); 

router.get('/', indexCtrl.index); 

module.exports = router; 

답변

0

변경하여 index.controller.js에서 경로 정의를 app.js

self.index = (req, res, next) => { 
    logger.info("Logging info"); 
    return self.get("http://api2-ci.example.com/post/5854346").then((cart) => { 
     logger.log("info", "log", cart); 
     res.render('index', { title: 'Express from Controller' }); 
    }).catch(next); 
}; 
+0

형식 오류 : req.next이 완료 (/Users/gs/webprojects/errors/node_modules/express/lib/response.js:955:25) 에서/사용자/천을/webprojects/오류/node_modules에서 기능 아니다 /hbs/lib/hbs.js:82:16 at /Users/gs/webprojects/errors/node_modules/hbs/lib/hbs.js:73:9 at tryToString (fs.js : 449 : 3) at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js : 436 : 12) – Guillermo

+0

답변 해 주셔서 감사합니다! 여전히 작동하지 않으며 콘솔을 통해 오류를보고하고 req.next에 대해 경고합니다. (노드 v6.2.1 사용) – Guillermo

+0

@Guillermo 그 코드에서 아무것도 고려하지 않는 이상한 오류는'req.next'를 참조하고 있습니다. – idbehold