ご覧いただきありがとうございます。
現在開発しているReactアプリで、サインイン時のエラーハンドリングがうまくいかない状態です。
現在の状況
ユーザーが正しいメールアドレスとパスワードを入力したら期待したレスポンスが返ってくるのですが、間違ったものを入力したら常に502 BadGatewayが返ってきます。
現在のエラーハンドリングの流れ
まずソースコードを示しながら現在のエラーハンドリングのやり方を解説します。
現在のエラーハンドリングは次の2ステップです。
①ユーザーが間違ったメールアドレスでサインインリクエストを送るとsignin.ts
でthrow 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時間近く解決に費やしていますが、一向に原因が分かりません。
もし詳しい方がいたらアドバイスだけでもいただければ幸いです。
是非よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。