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机制使用了两个步骤:
- 创build404错误并设置其状态
-
将它交给以下通用处理程序:
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一个新的Error
types来禁用types检查,因为已经存在于@types/node
。
相反,你应该扩展这种错误types:
interface ResponseError extends Error { status?: number; }