2016-12-27 21 views
7

Bu yüzden, express.js'yi kullanıyorum ve node 7 ile async/await kullanarak arıyorum. Hala hataları yakalayabilmem ancak try/catch bloğundan kurtulabilmemin bir yolu var mı? Belki bir fonksiyon sarıcı? Bunun aslında işlevin kodunu nasıl uygulayacağından emin değilim ve ayrıca next(err) numaralı telefonu arayın.Bir bekle/eşzamansız deneme/yakalama bloğunu her işleve sarmanın bir yolu var mı?

exports.index = async function(req, res, next) { 
    try { 
    let user = await User.findOne().exec(); 

    res.status(200).json(user); 
    } catch(err) { 
    next(err); 
    } 
} 

Böyle bir şey ...?

function example() { 
    // Implements try/catch block and then handles error. 
} 

exports.index = async example(req, res, next) { 
    let user = await User.findOne().exec(); 
    res.status(200).json(user); 
} 

DÜZENLEME: Bu daha benzer

şey:

Bu şekilde deneme/yakalama bloğu ele ama çalışmıyor
var wrapper = function(f) { 
    return function() { 
     try { 
      f.apply(this, arguments); 
     } catch(e) { 
      customErrorHandler(e) 
     } 
    } 
} 

:

exports.index = wrapper(async example(req, res, next) { 
    let user = await User.findOne().exec(); 
    res.status(200).json(user); 
}); 

Is there a way to add try-catch to every function in Javascript? Bkz async olmayan örnek için. Özellikle (

function wrapper(f) { 
    return async function() { 
//   ^^^^^ 
     try { 
      return await f.apply(this, arguments); 
//     ^^^^^ 
     } catch(e) { 
      customErrorHandler(e) 
     } 
    } 
} 

Yoksa daha ifade etmek uyarlanmış bu örnekte olduğu gibi, doğrudan sözler kullanın: -

+1

Sadece ekspres-sözünü – Bergi

+1

kullanmak Sen sarma işlevi zaman uyumsuz olması yapmadan bir bekliyor sarmalayamazsınız. Bu durumda, neden sadece .then() 've' .catch() 'yi kullanmayın. Seni bekleyen ne bekliyor? Hata işlemenin orada olması gerekiyor. Bunu başka bir işleve bırakamazsın. – jfriend00

+0

İç içe geçmiş 'then' ifadelerini çatallarına ihtiyaç duyduklarında çıkarmanın yollarını arıyorum. Yukarıdaki kod, yalnızca örnek olarak verilmiştir. – Neverlax

cevap

5

Evet, kolayca yanı asenkron fonksiyonlar için böyle bir sarmalayıcı yazabilir sadece async/await kullanmak parametrelerinin sayısı) ile:

function promiseWrapper(fn) { 
    return (req, res, next) => { 
     fn(req, res).catch(next); 
    }; 
} 
+0

Bu işe yarıyor. Yine de, async gerçek sarma işlevi yerine döndürülen işleve uygulanmalıdır. Bu düzenlemeyi yapabilir misiniz, böylece cevabı işaretleyebilir miyim? Teşekkürler! – Neverlax

+0

Oops, elbette. İpucu için teşekkürler! – Bergi

+0

Evet, bir ok işlevi, ancak düz bir işlev de işe yarayacaktı. Önemli olan, resmen parametre olarak tanımlanmaları, yani, işleyicileri ayırmak için kullanımları ifade eden 'promiseWrapper (…) .length == 3' olmasıdır. – Bergi

İlgili konular