Obsłużenie niepoprawnego zapytania SQL

0

Cześć.
Czytałem sobie ostatnio ten mądry artykuł: https://expressjs.com/en/guide/error-handling.html
W którym znalazłem informację:

/*Starting with Express 5, route handlers and middleware that return a Promise will call next(value) 
automatically when they reject or throw an error. For example:*/

app.get('/user/:id', async (req, res, next) => {
  const user = await getUserById(req.params.id)
  res.send(user)
})

Niestety mój podobny kod zdaje się tak nie działać i błąd blokuje mi działanie serwera:

server.get('/query/:id', async (req, res, next)=> {
  const result = await  getUserData(req.params.id);
   res.send(result)
})

server.listen(1236)

async function getUserData(id) {
    const result = await sql.query`SELECT * FROM dbo.userss WHERE Id = ${id}`
    return result.recordset[0]
}
  • Zrobiłem celowo błąd: users -> userss

Czy wiecie dla czego express nie może obsłużyć tego błędu?

0
adams0 napisał(a):

Czy wiecie dla czego express nie może obsłużyć tego błędu?

No na moje oko to ten request powinien odpowiedzieć 500tką; czy tak się dzieje u Ciebie? A jeśli nie, to jaki efekt widzisz?

Innymi słowy "blokuje mi działanie servera" to co to znaczy, konkretnie? Nie wysyła się odpowiedź w ogóle, połączenie jest zerwane, etc.?

0

Nie wysyła się odpowiedź w ogóle.
Nodemon wyrzuca mi:

app crashed - waiting for file changes before starting...
1
adams0 napisał(a):

Nie wysyła się odpowiedź w ogóle.
Nodemon wyrzuca mi:

app crashed - waiting for file changes before starting...

Wygląda jakby aplikacja zakończyła działanie, przez niezłapany wyjątek.

Strzelam że sql.query rzuca wyjątek, i powinieneś go złapać.

0

Gdy zmienię funkcję na:

async function getUserData(id) {
    try {
        const result = await sql.query`SELECT * FROM dbo.userss WHERE Id = ${id}`
        return result.recordset[0]  
    }
    catch(e) {
        console.log(e)
    }
}

To wyjątek jest obsłużony i nic się nie blokuje.
Tylko dalej nie rozumiem dla czego express nie zrobił tego automatycznie (chyba powinien zgodnie z dokumentacją)

  • Używam biblioteki mssql do stworzenia zapytania SQL
0
adams0 napisał(a):

Gdy zmienię funkcję na:

async function getUserData(id) {
    try {
        const result = await sql.query`SELECT * FROM dbo.userss WHERE Id = ${id}`
        return result.recordset[0]  
    }
    catch(e) {
        console.log(e)
    }
}

To wyjątek jest obsłużony i nic się nie blokuje.
Tylko dalej nie rozumiem dla czego express nie zrobił tego automatycznie (chyba powinien zgodnie z dokumentacją)

  • Używam biblioteki mssql do stworzenia zapytania SQL

A skąd pomysł że miałby to obsłużyć sam?

Takie niejawne wpływy na kontrolę przepływu (przez niektórych określane mianem "magia") raczej nie uchodzi za dobrą praktykę.

0

Stąd że tak sugeruje artykuł na ich stronie.
Kim jestem żeby dyskutować z twórcami frameworków odnośnie architektury? Ja to skromy chłopak jestem ;-).
Swoją drogą wszystkie błędy w nie asynchronicznych callbackach są obsłużone przez framework automatycznie np:

server.get('/:text', (req, res) => {
    const {text} = req.params;
    console.srog(text);
    res.send('<p>Think you</p>')
})

Oczywyście można ten błąd przechwycić i obsłużyć ręcznie wstawiając na koniec wszystkich middleware coś typu:

server.use((error, req, res, next) => {
    res.send('<h1>&#12951 Some weird error happend &#12951</h1><p>' + error + '</p>')
})

Ale gdy tylko w tym server.get dodam słówko async to mam błąd o którym wspominałem wcześniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1