With fast-csv how do I call an asynchronous validator?

331 Views Asked by At

How do I call a function that returns a promise?

const checkDatabase = async (row: Row): Promise<boolean> => {
  return await checkDatabaseService.check()
}

With a pipeline such as

parseStream(steam, {})
.validate(row: Row, processValidationError) : void => {
  processValidationError(null, checkDatabase(), 'ok')
}
.on('data-invalid', (row: Row, rowNumber: number, reason: string) => {
  console.log(`${JSON.stringify(row)} ${rowNumber} ${reason}`)
}
.on('data', row => email(row))
.on('error', error => console.error(error))
.on('end', (rowCount: number) => console.log(`Processed ${rowCount} rows.`));

The .validate call doesn't work.

1

There are 1 best solutions below

0
Interlated On

The following pattern worked using validate and data-invalid.

parseStream(stream, {})
  .validate((row: Winner, validationErrorCb): void => {
    validateEmail(row, validationErrorCb)
  })
  .on('data', row => this.promises.push(saveRow(row)))
  .on('data', row => this.promises.push(email(row)))
  .on('data-invalid', (row, rowNumber: number, reason: string) => {
       console.log(`Invalid [rowNumber=${rowNumber}] 
       [row=${JSON.stringify(row)}] [reason=${reason}]`)
                const errorRow = processValidationError(row, rowNumber, reason)
                this.promises.push(saveRow(errorRow))
            })

The callback methods check the data and return a validation callback with isValid: false in the case of failure

 const validateEmail = (row: Winner, validationErrorCb: RowValidateCallback): void => {
    const valid = row.email && !EmailValidator.validate(row.email)
    if (valid) {
      return validationErrorCb(null, true, 'ok')
    }

    row.winPayStatus = WinPayStatus.invalid
    const msg = `Key email ${row.email} is invalid.`
    console.error(msg + JSON.stringify(row))
    return validationErrorCb(null, false, msg)
  }