Express和Typescript – Error.stack和Error.status属性不存在

我试图从JavaScript转换现有的node.js项目打字稿。 我一直在使用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); }); 

但是,我收到以下错误消息: types'错误'上不存在属性“状态”。

如果我尝试并调用Error的.stack属性,则会收到类似的消息: 属性“堆栈”在types“错误”中不存在。

有人知道这里发生了什么?

编辑:史蒂夫芬顿指出,我可以把错误状态的响应对象。 但是,我的error handling机制使用了两个步骤:

  1. 创build404错误并设置其状态
  2. 将它交给以下通用处理程序:

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

所以错误状态首先在Error对象上设置,然后由error handling程序回读以决定如何处理错误。

你可以告诉TypeScript 你的用例Error可能有一个status

 interface Error{ status?: number; } 

所以你得到:

 interface Error{ status?: number; } var err = new Error('Not Found'); err.status = 404; 

但是我不得不说,你的expression代码是非惯用的,但是TypeScript可以理解它,如果你告诉它的话。

你把错误代码放在响应中

 app.use(function (req, res, next) { var err = new Error('Not Found'); res.status = 404; next(err); }); 

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; 

我刚刚去了

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

在我看来,最好的办法不是通过将错误设置为any ,或者创build一个新的Errortypes来禁用types检查,因为已经存在于@types/node

相反,你应该扩展这种错误types:

 interface ResponseError extends Error { status?: number; }