既存の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段階のプロセスを使用します。
次の汎用ハンドラーに渡します。
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
したがって、エラーステータスは最初にErrorオブジェクトに設定され、次にエラーハンドラーによって読み取られて、エラーの処理方法が決定されます。
TypeScriptにyourの場合はError
にstatus
が含まれる可能性があることを通知できます。
interface Error{
status?: number;
}
だからあなたは得る:
interface Error{
status?: number;
}
var err = new Error('Not Found');
err.status = 404;
しかし、私はあなたのエクスプレスコードは慣用的ではないと言っておかなければなりませんが、TypeScriptはあなたがそれについて教えてくれればそれを理解することができます。
あなたは応答にエラーコードを入れます...
app.use(function (req, res, next) {
var err = new Error('Not Found');
res.status(404)
next(err);
});
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
});
});
これは通常、TypeScriptでオブジェクトを遅延初期化する方法に関する問題です。
これを行う理想的な方法は次のとおりです。
interface ErrorWithStatus extends Error {
status: string
}
let foo = new Error() as ErrorWithStatus;
foo.status = '404';
any
、またはNULL可能フィールドを持つインターフェースを使用すると、通常よりも弱いコントラクトが残ります。
TypeScriptの別のオプション:
const err: { status?: number, message:string } = new Error('Not Found');
err.status = 404;
TypeScriptの別のオプション:
let err: any;
err = new Error();
err.status = 404;
私が間違っていない場合は、実際に期待されるタイプを取得することが常に最善です。私は正しいサポートを見つけることができませんでしたが、使用します。
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);
});
私はちょうど行きました
var err = new Error('Not Found');
err['status'] = 404;