从节点 14 升级到节点 18 后流行为有所不同

问题描述 投票:0回答:1

我是 Node.js 新手,我需要将项目的节点版本从 Node 14 升级到 Node 18。几乎所有事情都正常,但其中一个单元测试失败了。这是单元测试:

import { ValidationError } from "../../errors"
import { validateCSVHeader } from "../validateCSVHeader"

describe("validateCSVHeader", () => {
  it("Should not throw error if validHeaders included in buffer", async () => {
    const csvBuffer = Buffer.from(`yo,playerId
    1234567,abcd
    7654321,efgh
    `)

    await expect(
      validateCSVHeader(csvBuffer, { validHeaders: ["accountId", "playerId"] })
    ).resolves.not.toThrowError()
  })

  it("Should pass if no specific headers is required", async () => {
    const csvBuffer = Buffer.from(`yo,playerId
    1234567,abcd
    7654321,efgh
    `)

    await expect(validateCSVHeader(csvBuffer)).rejects.toThrowError()
  })

  it("Should throw error if validHeaders not included in buffer", async () => {
    const csvBuffer = Buffer.from(`yo,playerId
    1234567,abcd
    7654321,efgh

    `)

    await expect(
      validateCSVHeader(csvBuffer, { validHeaders: ["accountId"] })
    ).rejects.toThrow(new ValidationError("Invalid CSV Header"))
  })

  it("Should throw error if csv format", async () => {
    const csvBuffer = Buffer.from("")

    await expect(
      validateCSVHeader(csvBuffer, { validHeaders: ["accountId", "playerId"] })
    ).rejects.toThrow(new ValidationError("Invalid CSV Header"))
  })
})

出现以下错误:

这是源代码:

import parse from "csv-parse"
import stream, { Readable, Writable } from "stream"
import util from "util"

import { ValidationError } from "../errors"

const pipeline = util.promisify(stream.pipeline)

type ValidationsType = {
  validHeaders?: string[]
}

export const validateCSVHeader = async (
  fileBuffer: Buffer,
  validations?: ValidationsType
) => {
  const { validHeaders = [] } = validations || {}

  const csvParser = parse({
    delimiter: ",",
    bom: true,
    columns: false,
    skip_empty_lines: true,
    to_line: 1,
    record_delimiter: ["\r", "\n", "\r\n"],
  })

  const readable = Readable.from(fileBuffer)

  const data: any[] = []
  const writable = new Writable({
    objectMode: true,
    write(chunk, _encoding, callback) {
      data.push(chunk)
      callback()
    },
  })

  await pipeline(readable, csvParser, writable)

  console.log(data)

  const [firstLine] = data
  if (firstLine && validHeaders.some((header) => firstLine.includes(header))) {
    return
  }

  throw new ValidationError("Invalid CSV Header", {
    fileHeaders: firstLine,
    validHeaders: validHeaders,
  })
}

我尝试在创建可读流后添加

readable.resume()
调用,但没有成功。

当我执行

console.log(data)
时,它输出空
[]
,但在节点14中会输出
['yo', 'playerId']
。我可以知道出了什么问题以及如何更新代码吗?谢谢你。

node.js stream node-csv-parse
1个回答
0
投票

最后我发现我们使用的包

csv-parse
的版本不支持Node 18。将包
csv-parse
升级到
5.5.0

后就可以使用了
© www.soinside.com 2019 - 2024. All rights reserved.