🌟

UnhandledPromiseRejection: (Node.js15から出現したエラー)

2022/02/09に公開

この記事でやること

とりあえず、エラーを解消するだけの解説になります。
色々複雑な説明があると思うのですが、初めてNode.jsを触る方が挫折しないために、とりあえずエラーをなくす方法のみを解説します。

エラー文

UnhandledPromiseRejection: 
This error originated either by throwing inside of an async function without a catch block, 
or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "undefined".

エラー分の内容から、Promiseでreject()が返された時に、それを.catch()で受け取っていないからエラーが出ているみたい。

解決策

解決策は簡単で、Promiseオブジェクトを使用している関数を参照している処理に、.catch()を記載する。
getUser()という関数でPromiseオブジェクトを使用している場合、それを参照しているgetUser()を、
以下のようにしてください。

getUser().catch((code) => { console.error("error:" + code); })

これは一旦エラーをなくすための処理ですが、本来は、.catchを使ってエラー処理などを行なっていけると良いと思います。

コード例

app.post('/api/v1/users', async (req, res) => {
    const db = new sqlite3.Database(dbPath)

    // SELECT文で、存在しないhogehogeというカラムを設定し、SELECTが失敗するようにする
    await run('SELECT id, name, birthday, hogehoge  FROM Users')
    // 成功時のresolve()を受け取る
    .then((code) => { console.log("normal:" + code); })
    // 失敗時のreject()を受け取る
    //この処理がないとUnhandledPromiseRejection: が発生する。
    .catch((code) => { console.error("error:" + code); })
    db.close()
})

const run = async (sql) =>{
    return new Promise((resolve, reject) =>{
        db.run(sql, (err) =>{
            if(err){
                res.status(500).send(err)
                return reject()
            }else{
                res.json({message:message})
                return resolve()
            }
        })
    })
}

ただこれを直しても他のエラーが出ます

このエラーは、何かしらの処理が失敗(reject)された時に、発生しているので、このエラーが改善しても、そもそも処理が失敗している可能性が高いので、そこは頑張って治してください。

詳しく知りたい方は

以下の記事が参考になるので、みてみてください。
https://zenn.dev/kimamula/articles/b32d11d52c2b7a733119
https://zenn.dev/uhyo/articles/unhandled-rejection-understanding

Discussion