Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript:Property';解码';类型请求中不存在_Javascript_Node.js_Express_Typescript_Request - Fatal编程技术网

Javascript Typescript:Property';解码';类型请求中不存在

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.' });

我有以下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.' });    
      } 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实际上是的,这是自定义字段。哦,那么什么是最好的方法呢?这是一个非常模糊的方法(尽管是常见的方法)。我不推荐它,而且这肯定不是最好的方法。我会向所有来这里寻求真实答案的人推荐这种方法,因为它是本页上唯一真正有效的方法。这种方法只会导致跟踪更多类型错误,例如,error
TS2345: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();