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;
형식 오류 : 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
답변 해 주셔서 감사합니다! 여전히 작동하지 않으며 콘솔을 통해 오류를보고하고 req.next에 대해 경고합니다. (노드 v6.2.1 사용) – Guillermo
@Guillermo 그 코드에서 아무것도 고려하지 않는 이상한 오류는'req.next'를 참조하고 있습니다. – idbehold