fp-ts:过滤掉某些左边的值,右边的错误

fp-ts: Filter out certain left values, and error on right

我想使用 fp-ts 忽略某些错误(如果发生,则表示一切顺利,即在注册过程中缺少帐户)。

我有以下代码:

export const handleSignup = async (server: FastifyInstance): Promise<void> => {
  server.post('/signup', async (req, res) => {
    const {email} = req.body as SignupPostData
    const {redirectUri} = req.query as Record<'redirectUri', string>

    return pipe(
      withDb(lookupAccountByEmail)(email),
      TE.chain(() => flow(generateMagicLinkToken, TE.fromEither)(email)),
      TE.chain(sendSignupEmail(email, redirectUri))
    )().then(foldReply<SignupApiResponse>(res))
  })
}

lookupAccountByEmail 函数将 return 一个帐户,或者 return 一个错误对象。 如果帐户是 returned,我需要 return 代码 'account-exists' 的错误。如果代码为 'account-not-found' 的错误对象被 returned,我希望一切继续,就好像没有问题一样。如果带有任何其他代码的错误对象被 returned,它仍然应该出错。

在 fp-ts 中处理此问题的最佳方法是什么?

您可以使用 TE.fold.

const doSignup = pipe(
  generateMagicLinkToken(email),
  TE.fromEither,
  TE.chain(sendSignupEmail(email, redirectUri))
)
return pipe(
  email,
  withDb(lookupAccountByEmail),
  TE.fold(
    left => left.error === 'account-not-found' ? doSignup : TE.left(left)
    right => TE.left({error: 'account-exits'})
  ),
  T.map(foldReply<SignupApiResponse>(res))
)()