我是fp-ts
的新手,我正在尝试创建一个类似函数的方法,它:
1.解析承载令牌
1.使用解析的令牌检查用户是否有效
import { Request } from 'express';
import { either } from 'fp-ts';
import { pipe } from 'fp-ts/lib/function';
// * Parse the token
declare const parseRawToken: (rawToken: string | undefined) => either.Either<Error, string>;
// * Interface of the validate method
type MakeIsRequestAuthenticated = (
validateUserWithToken: (data: string) => Promise<either.Either<Error, void>>,
) => (request: Request) => Promise<either.Either<Error, void>>;
我想将这些验证链接到一个管道中,所以我尝试通过以下方式实现验证:
export const makeIsRequestAuthenticated: MakeIsRequestAuthenticated = validateUserWithToken => {
// * Validate the request
return async request => {
return pipe(
parseRawToken(request.header('Authorization')),
either.chain(validateUserWithToken)
);
};
};
但它给出了以下错误:
Argument of type '(data: string) => Promise<Either<Error, void>>' is not assignable to parameter of type '(a: string) => Either<Error, void>'.
Type 'Promise<Either<Error, void>>' is not assignable to type 'Either<Error, void>'.ts(2345)
我试过用TaskEither
和其他一些解决方案替换Promise
,但都不起作用
我希望使用chain
或其他一些方法,以便能够在pipe
中执行所有这些操作
1条答案
按热度按时间ia2d9nvy1#
希望这能有所帮助:
现在方法
MakeIsRequestAuthenticated
返回一个TaskEither<Error, Request>
,你可以把它和任何一个以Request
为参数的方法链接起来,从现在开始你可以用taskEither代替promise,但这应该不是问题。