2015-07-14 2 views
1

У меня есть приложение для узлов, которое пользователи могут предоставить собственную функцию и в соответствии с некоторым URL-адресом, который пользователь дает, я вызываю эту функцию, проблема в случае ошибки не останавливается, поэтому я хочу как-то получить ошибку в вызывающем абоненте (если есть) в случае прекращения ответа, что записывается в этом случае?Функция Warp снаружи с обработкой ошибок

чтобы сказать, что это функция, пользователь при условии, в случае, если у нас есть файл в каталоге это работает отлично

delete: function (req,res,Path) { 

    var fileRelPath = 'C://'+ Path; 
    fs.unlinkSync(Path); 
    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.end("File was deleted"); 
}, 

Я призываю к этой функции из другого модуля вызова функции

plugin[fnName](req, res, Path); 

В случае, если файл не существует, я получил сообщение об ошибке и процесс вызова не останавливается ... я должен проверить, возможно, как-то после выше вызова код, если был вызван res.end(), если не закончить его явным, если да, то как проверить, закончилось ли это.

Я имею в виду что-то вроде

plugin[fnName](req, res, Path); 
if(res.end was not invoked) 
res.end("error occurred" ) 
maybe to provide additional data somehow about the err .. 

ответ

2

Вы можете попробовать следующее. Но функция должна быть синхронной, как пример, который вы предоставили. В противном случае try..catch не будет работать.

var error; 
try{ 
    plugin[fnName](req, res, Path); 
} 
catch(e){ 
    error = e 
} 

if(!res.headerSent){ 
    res.send(error); 
} 

Для операций Async вы должны переписать функцию в узле стиля обратного вызова:

deleteAsync: function (req,res,Path,done) { 
    var fileRelPath = 'C://'+ Path; 
    fs.unlink(Path, function(err){ 
     if(err) 
     return done(err) 
     res.writeHead(200, { 'Content-Type': 'text/plain' }); 
     res.end("File was deleted"); 
    }); 


}, 

тогда называть их так:

plugin[fnNameAsync](req, res, Path,function(err){ 
    if(err) 
    res.send(err) 
}); 
+0

Спасибо проголосовали! предположим, что я хочу обрабатывать как sync, так и async, как мне это сделать? с обещанием? можете ли вы привести пример? –

+0

@JhonDree - оберните метод в обещание и используйте 'co-express', чтобы в основном повернуть маршрут в генератор. –

+0

@ SwarajGiri- Спасибо, можете ли вы представить пример, пожалуйста, как это сделать? –

Смежные вопросы