Javascript Typescript:Property';解码';类型请求中不存在
我有以下javascript代码:Javascript Typescript:Property';解码';类型请求中不存在,javascript,node.js,express,typescript,request,Javascript,Node.js,Express,Typescript,Request,我有以下javascript代码: if (token) { // verifies secret and checks exp jwt.verify(token, Config.Secret, function(err, decoded) { if (err) { return res.json({ success: false, message: 'Failed to authenticate token.' });
if (token) {
// verifies secret and checks exp
jwt.verify(token, Config.Secret, function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
要将其重写为typescript,但在类型请求上不存在解码的错误属性
有没有办法解决这个问题?您需要使用声明合并来添加自定义请求
字段的类型定义。为此,请创建一个如下所示的.d.ts
文件:
declare module Express {
export interface Request {
decoded: string;
// etc.
}
}
req.body.decoded = decoded;
next();
并将其添加到编译上下文中,以便编译器将类型定义与express.d.ts
中的类型定义合并。即使可能,我也不会合并来自同名模块的接口。我宁愿创建一个新的自定义接口,您甚至可以在使用它的同一个文件中声明它。(否则,只需将其导出)
这更干净,而且更接近OOP。如果您不想发出新的类扩展请求,您可以将请求作为如下对象访问:
req['decoded'] = decoded;
如果它仍然向您抛出,您可能必须将req转换为对象(typescript):
(req)['decoded']=已解码;
您甚至可以将req转换为键入any并访问解码为属性(typescript):
(req).decoded=已解码;
该错误意味着express中的原始类型没有任何具有该名称的字段
您有两个选项来解决这个问题,第一个如前所述,您可以创建一个声明模块文件并添加您的自定义字段,这样在每个请求中该字段都是可用的
declare module Express {
export interface Request {
decoded: string;
// etc.
}
}
选项二:您可以创建一个自定义接口,扩展原始请求并添加解码字段
export default interface ICustomRequest extends Request {
token: string;
}
然后在代码中
app.post('/', function (req: ICustomRequest, res) {
req.decoded = decoded; // No errors here
});
第一个解决方案是将自定义字段“添加”到请求中,第二个解决方案是添加字段并从请求扩展
在您的情况下,我将使用第一种解决方案,以避免每次您必须使用请求中的解码
字段时写入ICustomRequest(或您选择的任何名称),文件.d.ts
不需要在您的代码中导入,这样您就可以创建文件并完成它。我的“解码”只是用户id字符串,我这样解决了这个问题:
declare module Express {
export interface Request {
decoded: string;
// etc.
}
}
req.body.decoded = decoded;
next();
您是否有请求
的类型定义?@VadimMacagon是的,它来自express
从“express”导入{Request,Response}代码>我在中看到没有解码的
字段,这是您自己添加的字段吗?@VadimMacagon实际上是的,这是自定义字段。哦,那么什么是最好的方法呢?这是一个非常模糊的方法(尽管是常见的方法)。我不推荐它,而且这肯定不是最好的方法。我会向所有来这里寻求真实答案的人推荐这种方法,因为它是本页上唯一真正有效的方法。这种方法只会导致跟踪更多类型错误,例如,errorTS2345:Argument of type'(req:CustomRequest,res:Response)=>void'不可分配给'RequestHandlerParams'类型的参数。Type'(req:CustomRequest,res:Response)=>void'不可分配给Type'(RequestHandler | ErrorRequestHandler)[]。类型(req:CustomRequest,res:Response)=>void)中缺少属性“push”。
您能提供一个出现此问题的代码段吗?我在扩展express的标准接口方面从来没有遇到过问题。我想明白。你的问题和2。否决票。你似乎和错误的人一起工作。。。
req.body.decoded = decoded;
next();