我是 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']
。我可以知道出了什么问题以及如何更新代码吗?谢谢你。
最后我发现我们使用的包
csv-parse
的版本不支持Node 18。将包csv-parse
升级到5.5.0
后就可以使用了