Express 和 Typescript - Error.stack 和 Error.status 属性不存在
Express and Typescript - Error.stack and Error.status properties do not exist
我正在尝试将现有的 node.js 项目从 javascript 转换为打字稿。我一直在使用 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 指出我可以将错误状态放在响应对象上。但是,我的错误处理机制使用了两步过程:
- 创建 404 错误并设置其状态
将其交给以下通用处理程序:
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
因此错误状态首先在 Error 对象上设置,然后由错误处理程序回读以决定如何处理错误。
您将错误代码放在响应中...
app.use(function (req, res, next) {
var err = new Error('Not Found');
res.status(404)
next(err);
});
扩展全局Error
您可以告诉 TypeScript,对于 您的 用例 Error
可能有一个 status
:
interface Error {
status?: number;
}
所以你得到:
interface Error {
status?: number;
}
var err = new Error('Not Found');
err.status = 404;
备选
将状态放在 res
上并发送 err
。例如:
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
res.status(404); // using response here
next(err);
});
我刚去
var err = new Error('Not Found');
err['status'] = 404;
TypeScript 中的另一个选项:
let err: any;
err = new Error();
err.status = 404;
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 中的另一个选项:
const err: { status?: number, message:string } = new Error('Not Found');
err.status = 404;
我认为最好的方法是不要通过将错误设置为 any
或创建新的 Error
类型来禁用类型检查,因为 @types/node
中已经存在一个.
相反,您应该扩展该错误类型:
interface ResponseError extends Error {
status?: number;
}
这通常是关于如何在 Typescript 中惰性初始化对象的问题。
理想的方法是:
interface ErrorWithStatus extends Error {
status: string
}
let foo = new Error() as ErrorWithStatus;
foo.status = '404';
使用 any
或与可为空字段的接口,让您的合同质量低下和薄弱。
如果我没记错的话,最好总是获得实际预期的类型。我找不到任何硬性支持,我是对的,但我使用:
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);
});
我正在尝试将现有的 node.js 项目从 javascript 转换为打字稿。我一直在使用 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 指出我可以将错误状态放在响应对象上。但是,我的错误处理机制使用了两步过程:
- 创建 404 错误并设置其状态
将其交给以下通用处理程序:
app.use(function (err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); });
因此错误状态首先在 Error 对象上设置,然后由错误处理程序回读以决定如何处理错误。
您将错误代码放在响应中...
app.use(function (req, res, next) {
var err = new Error('Not Found');
res.status(404)
next(err);
});
扩展全局Error
您可以告诉 TypeScript,对于 您的 用例 Error
可能有一个 status
:
interface Error {
status?: number;
}
所以你得到:
interface Error {
status?: number;
}
var err = new Error('Not Found');
err.status = 404;
备选
将状态放在 res
上并发送 err
。例如:
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
res.status(404); // using response here
next(err);
});
我刚去
var err = new Error('Not Found');
err['status'] = 404;
TypeScript 中的另一个选项:
let err: any;
err = new Error();
err.status = 404;
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 中的另一个选项:
const err: { status?: number, message:string } = new Error('Not Found');
err.status = 404;
我认为最好的方法是不要通过将错误设置为 any
或创建新的 Error
类型来禁用类型检查,因为 @types/node
中已经存在一个.
相反,您应该扩展该错误类型:
interface ResponseError extends Error {
status?: number;
}
这通常是关于如何在 Typescript 中惰性初始化对象的问题。
理想的方法是:
interface ErrorWithStatus extends Error {
status: string
}
let foo = new Error() as ErrorWithStatus;
foo.status = '404';
使用 any
或与可为空字段的接口,让您的合同质量低下和薄弱。
如果我没记错的话,最好总是获得实际预期的类型。我找不到任何硬性支持,我是对的,但我使用:
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);
});