带有 express-unless 的 Node.js express-jwt 给出警告“对象可能是'未定义'”

Posted

技术标签:

【中文标题】带有 express-unless 的 Node.js express-jwt 给出警告“对象可能是\'未定义\'”【英文标题】:Node.js express-jwt with express-unless gives a warning "Object is possibly 'undefined'"带有 express-unless 的 Node.js express-jwt 给出警告“对象可能是'未定义'” 【发布时间】:2017-10-23 01:17:57 【问题描述】:

使用 typescript 和 nodejs,以及 express-jwt 来验证真实性。 当我们将 express-jwt 与 unless 一起使用时,如下所示,tslint 抱怨在 unless 函数之后可能返回的未定义值。

import * as express from "express";
import * as jwt from "express-jwt";
import * as http from "http";

const refConfig = hash: 'mycompletelysecrethashstring', othersetting: 1 ;

app.use("/api", jwt( secret: refConfig.hash ).unless( path: ["/api/auth/signin"] ));
app.set("port", 8000);
const server: http.Server = app.listen(app.get("port"), () => 
    console.log("Server is now running on port " + server.address().port);
);

错误信息如下:

[ts] Object is possibly 'undefined'.

是否有可能摆脱此警告,如果可以,正确的做法是什么?

问题在于以下行:

app.use("/api", jwt( secret: refConfig.hash ).unless( path: ["/api/auth/signin"] ));

据我所知,TypeScript 编译器抱怨路由列表在除非结尾可能是一个空列表。鉴于原始列表是“/api/auth/signin”的超集,这不是一个有效的问题,但我无法摆脱警告。

提前致谢。

【问题讨论】:

【参考方案1】:

您在使用refConfig.hash 时没有确定refConfig 本身是否首先被定义。

您应该改为:

if (refConfig) 
   app.use("/api", jwt( secret: refConfig.hash ).unless( path: ["/api/auth/signin"] ));

更完整的检查是预先验证您的配置并处理不完整的情况(例如,提前退出并导致用户出错)。

【讨论】:

感谢您的回复,但是原代码中已经定义了refConfig,肯定不是这个原因。我已经更新了问题中的代码以反映这一事实。感谢您的提醒。 请分享 TypeScript 错误阻止的行号。 谢谢您。我对问题进行了更改以提供更准确的问题。【参考方案2】:

除非您在示例中缺少它,否则您需要创建 app 实例:

const app = express() 
app.use(/*...*/)

另外,从你的例子来看,jwt 不是一个函数,而是一个对象。试试看,

import jwt from 'express-jwt'

【讨论】:

这只是应用程序的一部分,除了问题中提到的行上的警告之外,其他一切工作正常。

以上是关于带有 express-unless 的 Node.js express-jwt 给出警告“对象可能是'未定义'”的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Javascript 的 MySQL (node.js)

带有查询字符串参数的node.js http'get'请求

带有 require 的 Node.js ES6 类

babel-node vs node:带有导入/导出的graphql文件

Node.js 将带有函数定义的对象发送到工作线程

node.js - 带有 base64 的 http [重复]