2013-04-22 10 views
5

Mam funkcję o nazwie a, która akceptuje wywołanie zwrotne, które jest wywoływane z błędem, jeśli istnieje.Jaki jest właściwy sposób tworzenia komunikatów o błędach, które są zwracane w żądaniu ekspresowym?

a jest wywoływany w żądaniu trasy ekspresowej. Jeśli wystąpi błąd, błąd powinien być odpowiedzią na żądanie.

function a(cb) { 
    cb(new Error('Some error message')) 
} 

app.get('/', function (req, res) { 
    a(function (error) { 
    if (error) { 
     res.json(error, 400) 
    } 
    res.send('No error') 
    }) 
}) 

Szukałem w kodzie Express, a wydaje się, że res.json będzie stringify mój error. Jednak wynik ten jest pusty ciąg znaków:

> var e = new Error('Some error message') 
undefined 
> JSON.stringify(e) 
'{}' 
> e.message 
'Some error message' 

Istnieją sposoby, wpadło mi w drogę, aby wrócić tu komunikat o błędzie, takie jak przekształcenie obiektu błędzie toString w mojej trasie. Chciałbym jednak wiedzieć, jaka jest najlepsza praktyka w zakresie formatowania komunikatów o błędach w interfejsach API węzła i czy to wszystko zmienia tutaj. Należy formatować moje komunikaty o błędach inaczej, czy mam po prostu obsłużyć obiekt Error w trasie, takich jak:

res.json({ error: error.message }, 400) 
+0

Kilka szczegółów, dlaczego brakuje e.message: http://stackoverflow.com/questions/18391212/is-it-not-possible-to-stringify-an-error-using-json-stringify. – Smartkid

Odpowiedz

0

Express trasy można używać trzeci argument next które mogą być używane albo pominąć bieżącą trasę po prostu dzwoniąc next() lub przekazać błędów poprzez wywołanie next(err).

Spróbuj użyć:

app.get('/', function (req, res, next) { 
    a(function (error) { 
    if (error) { 
     next(error); 
    } 
    else { 
     res.send('No error') 
    } 
    }); 
}); 

Aby uzyskać więcej informacji, sprawdź http://expressjs.com/api.html#app.param

1

nie mam teraz co twoja odpowiedź wyglądać, gdy nie występuje błąd, ale to jest jak Zwykle obsługuję odpowiedzi JSON:

function (err, data) { 
    if (err) { 
     res.json({ 
      success: false, 
      error: err.message 
     }, 400); 
    } 
    else { 
     res.json({ 
      success: true, 
      data: data 
     }); 
    } 
} 

Spróbuj zawinąć to w dodatkowe oprogramowanie pośredniczące/funkcję. Zachowaj podpis funkcji podobny do standardowego stylu węzła. (Pierwszy błąd parametru, następujące parametry faktycznych danych.) W ten sposób klientowi łatwo jest przetworzyć odpowiedzi, ponieważ wszystko, co musisz zrobić, to zajrzeć do pola success.

+0

To wygląda obiecująco, dzięki. Poczekam trochę, zanim zaakceptuję, że to jest odpowiedź. –

5

Aby dodać użytkownika @ steveukx odpowiedź, można określić procedurę obsługi błędu w ekspresowym przez .use ing funkcję o liczbę operandów czterech .

app.use(function(err, req, res, next){ 
    res.json(500, { 
    error: err.message 
    }); 
}); 

Które będą wywoływane za każdym razem, gdy wykonasz next(err). Zobacz the docs.

Powiązane problemy