質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1001閲覧

エラーハンドリングが効かず、常に502 BadGatewayがかえってくる。

tenchim

総合スコア8

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/14 01:53

ご覧いただきありがとうございます。
現在開発しているReactアプリで、サインイン時のエラーハンドリングがうまくいかない状態です。

現在の状況

ユーザーが正しいメールアドレスとパスワードを入力したら期待したレスポンスが返ってくるのですが、間違ったものを入力したら常に502 BadGatewayが返ってきます。

現在のエラーハンドリングの流れ

まずソースコードを示しながら現在のエラーハンドリングのやり方を解説します。
現在のエラーハンドリングは次の2ステップです。

①ユーザーが間違ったメールアドレスでサインインリクエストを送るとsignin.tsthrow new BadRequestError()としてエラーを取得。

signin.tsのソースコードは以下です。

import { BadRequestError } from '../errors/bad-request-error'; //省略 async (req: Request, res: Response) => {  const { email, password } = req.body; const existingUser = await User.findOne({ email }); if (!existingUser) { throw new BadRequestError('Invalid credentials'); } //省略

ここで呼び出している../errors/bad-request-error.tsのソースコードは以下の通りです。

import { CustomError } from "./custom-error"; export class BadRequestError extends CustomError { statusCode = 400; constructor(public message: string) { super(message); Object.setPrototypeOf(this, BadRequestError.prototype); } serializeErrors() { return [{ message: this.message }]; } }

②throwされたエラーをerror-handler.tsで整形して、index.tsで呼び出す。

throw new BadRequestError();で作られたエラーをerror-handler.tsで少し整形します。
error-handler.tsは以下の通りです。

import { Request, Response, NextFunction } from 'express'; import { CustomError } from '../errors/custom-error'; export const errorHandler = ( err: Error, req: Request, res: Response, next: NextFunction ) => { if (err instanceof CustomError) { return res.status(err.statusCode).send({ errors: err.serializeErrors() }); } res.status(400).send({ errors: [{ message: 'Something went wrong' }] }); };

エラーメッセージを整形した後、index.tsのルーティングを以下のように設定して、ユーザーに返しています。

import { errorHandler } from './middleware/error-handler'; //省略 //他のルーティングがまず初めに設定されています。 app.use(currentUserRouter); app.use(signinRouter); app.use(signoutRouter); app.use(signupRouter); app.all('*', async (req, res) => { throw new NotFoundError(); }) //ここで先ほどの整形済みのエラーを返す app.use(errorHandler); //省略

以上が私が実装したエラーハンドリングの流れになります。

レスポンスの結果

期待していたレスポンスは以下のような配列です。

errors: [ { message: "Invalid credentials"} ]

しかし実際にPostmanでリクエストを送信すると502 BadGatewayが返ってきます。
コンソールでのログは以下の通りです。

[auth] listening on 3000... [auth] Error: Invalid credentials [auth] at BadRequestError.CustomError (/app/src/errors/custom-error.ts:5:5) [auth] at new BadRequestError (/app/src/errors/bad-request-error.ts:7:5) [auth] at /app/src/routes/signin.ts:29:13 [auth] at step (/app/src/routes/signin.ts:33:23) [auth] at Object.next (/app/src/routes/signin.ts:14:53) [auth] at fulfilled (/app/src/routes/signin.ts:5:58) [auth] at processTicksAndRejections (node:internal/process/task_queues:96:5) [auth] [ERROR] 01:00:57 Error: Invalid credentials

[auth]は現在のアプリのdockerコンテナです。
コンソールにはthrow new BadRequestError('Invalid credentials')で渡した引数が表示されていますが、クライアント側には502 BadGatewayが返ってきます。

かれこれ3時間近く解決に費やしていますが、一向に原因が分かりません。
もし詳しい方がいたらアドバイスだけでもいただければ幸いです。
是非よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちら自己解決いたしました。
後続の方に解決方法を記入いたします。

解決方法

こちらexpress-async-errorsというパッケージを追加しました。

こちらをindex.tsでimportします。

import express from 'express'; import 'express-async-errors'; //省略

Expressのasync関数の中でエラーハンドリングしたいときは
next(new Error('hogehoge');)のようにnextを使う。
②上記のようにexpress-async-errorsパッケージを追加してthrow new Error('hogehoge');とする。
の2つの選択肢が使えるようです。(①は試してないのでわかりません。)
参考記事:ExpressのAsync Errorのハンドリング

投稿2021/10/14 04:05

編集2021/10/14 04:22
tenchim

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問