我正在尝试使用Typescript实现firebase函数。到目前为止,我能够毫无问题地创建一些功能,直到我不得不处理身份验证为止。 这是我第一次使用打字稿,所以我可能会问一些对大多数开发人员显而易见的事情。
上下文:
我能够使用此example进行身份验证检查。 正如我们在该示例(javascript)中看到的那样,代码正在解码令牌并将用户信息传递给请求,该请求将由下一个函数进行处理。
问题:
我的问题是我不知道如何在打字稿中进行操作。 首先,我不得不在令牌验证器函数的参数中添加一些类型,因为编译器抱怨没有类型(例如在javascript示例中),所以我选择了这样的东西:
const validateFirebaseIdToken = async (req: any, res: any, next: any)
问题在于,在我的下一个功能中,我无法获取用户:
example.get('/', async (req, res) => {
req.user
}
我收到错误消息:'请求<字典<字符串>>'类型的属性'用户'不存在。
那么,在这种情况下您将如何做?我不想在第二个函数中再次解码令牌,因为这没有意义(我已经在上一步(令牌验证)中做到了)。
理想情况:
我想使用与javascript示例中相同的方法。
我想在令牌验证功能的参数中添加正确的类型。我尝试使用Request
这是我的代码:
const validateFirebaseIdToken = async (req: any, res: any, next: any) => {}
const example = express();
example.use(validateFirebaseIdToken);
example.get('/', async (req, res) => {}
答案 0 :(得分:1)
您的请求包含一个body
,其中包含您的user
。因此,您必须这样做:
example.get('/', async (req, res) => {
req.body.user
}
答案 1 :(得分:1)
要添加到@Constantin给出的可接受答案中的内容:
理想情况:
除了康斯坦丁给出的答案外,我还需要在请求中添加一个类型。
要求:express.Request
我最终有了这种方法:
const validateFirebaseIdToken = async (req: express.Request, res: express.Response, next: any) => {}
答案 2 :(得分:0)
我认为推荐的方法是使用{strong> here}中的声明合并。
src
文件夹中创建一个 type.d.ts 文件:import { auth } from "firebase-admin";
declare global {
namespace Express {
export interface Request {
user: auth.DecodedIdToken;
}
}
}
通过使用声明合并并指定用户道具的类型,您将获得自动完成支持。
express.Request
,请执行以下操作:import * as expressTypes from "express-serve-static-core";
const validateFirebaseIdToken = async (
req: expressTypes.Request<expressTypes.Dictionary<string>>,
res: expressTypes.Response,
next: expressTypes.NextFunction
) => {};