web-dev-qa-db-ja.com

ExpressおよびTypeScript-Error.stackおよびError.statusプロパティが存在しない

既存のnode.jsプロジェクトをJavaScriptからTypeScriptに変換しようとしています。 Visual Studio Express 4テンプレートのデフォルトの404エラーキャッチャーを使用しています。

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

ただし、次のエラーメッセージが表示されます:プロパティ 'status'はタイプ 'Error'に存在しません

エラーの.stackプロパティを呼び出そうとすると、同様のメッセージが表示されます:プロパティ 'stack'がタイプ 'Error'に存在しません

ここで何が起こっているのか誰か知っていますか?

編集: Steve Fentonは、応答オブジェクトにエラーステータスを置くことができると指摘しています。ただし、私のエラー処理メカニズムは2段階のプロセスを使用します。

  1. 404エラーを作成し、そのステータスを設定する
  2. 次の汎用ハンドラーに渡します。

    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: {}
        });
    });
    

したがって、エラーステータスは最初にErrorオブジェクトに設定され、次にエラーハンドラーによって読み取られて、エラーの処理方法が決定されます。

21
Joel

TypeScriptにyourの場合はErrorstatusが含まれる可能性があることを通知できます。

interface Error{
    status?: number;
}

だからあなたは得る:

interface Error{
    status?: number;
}

var err = new Error('Not Found');
err.status = 404;

しかし、私はあなたのエクスプレスコードは慣用的ではないと言っておかなければなりませんが、TypeScriptはあなたがそれについて教えてくれればそれを理解することができます。

14
basarat

あなたは応答にエラーコードを入れます...

app.use(function (req, res, next) {
    var err = new Error('Not Found');
    res.status(404)
    next(err);
});
8
Fenton
import * as express from 'express';
interface Error {
  status?: number;
  message?: string;
}

app.use((err: Error, req: express.Request, res: express.Response, next: express.NextFunction) => {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: err
  });
});
5
kunl

これは通常、TypeScriptでオブジェクトを遅延初期化する方法に関する問題です。

これを行う理想的な方法は次のとおりです。

interface ErrorWithStatus extends Error {
    status: string
}

let foo = new Error() as ErrorWithStatus;
foo.status = '404';

any、またはNULL可能フィールドを持つインターフェースを使用すると、通常よりも弱いコントラクトが残ります。

4
dmwong2268

TypeScriptの別のオプション:

const err: { status?: number, message:string } = new Error('Not Found');
err.status = 404;
3
Matthias

TypeScriptの別のオプション:

let err: any;
err = new Error();
err.status = 404;
3
Manu

私が間違っていない場合は、実際に期待されるタイプを取得することが常に最善です。私は正しいサポートを見つけることができませんでしたが、使用します。

import createError, { HttpError } from 'http-errors';

また、すべてのタイプについて完全にするために、使用するパラメータータイプもインポートします。

import express, { Request, Response, NextFunction } from 'express';

私が使用する実際の関数は次のようになります。

app.use((err: HttpError, req: Request, res: Response, next: NextFunction) => { ... }

あなた自身のエラーを作成したい場合:

app.use((req: Request, res: Response, next: NextFunction) => {
  next(createError(404));
});

またはあなたのコードに近い:

app.use((req: Request, res: Response, next: NextFunction) => {
  let err = new HttpError('Not found');
  err.status = 404;
  next(err);
});
0
Rutger de Graaf

私はちょうど行きました

var err = new Error('Not Found');
err['status'] = 404;
0
czechboy