我正在尝试解码从web服务器加载的。avro文件。
由于uInt8Array的字符串版本以S3中的
"buffer开头,Objavro.schema {"type";record";name";Destination";
我假设它是avro容器文件
我发现'avro.js'和'avsc'作为使用。avro格式和javascript的工具,但阅读文档听起来就像在Node.js中解码容器文件一样,而不是在浏览器中。(FileDecoder/Encoder方法将文件路径作为字符串,而不是uInt8Array)
我得到这个错误还是有另一种方法来解码。avro容器文件在浏览器中的javascript?
幸运的是,我找到了使用avsc的方法与broserify
avro.createBlobDecoder(blob, [{options}])
[avro.js - before browserifying]
var avro = require('avsc');
const AVRO = {
decodeBlob(blob) {
let schema, columnTitles, columnTypes, records = []
return new Promise((resolve) => {
avro.createBlobDecoder(blob, {
// noDecode: true
})
.on('metadata', (s) => {
schema = s
columnTitles = schema.fields.map(f => f.name)
columnTypes = schema.fields.map(f => f.type)
})
.on('data', (data) => {
records.push(data)
})
.on('finish', () => {
resolve(
{
columnTitles: columnTitles,
columnTypes: columnTypes,
records: records
}
)
})
})
}
}
module.exports = AVRO
<编辑>[package.json]编辑>"scripts": {
"avro": "browserify public/avro.js --s AVRO > public/build/avro.js"
}
<编辑>[someOtherFile.js]编辑>//s3.getObject => uInt8array
const blob = new Blob([uInt8array]) //arr in brackets !important
const avroDataObj = await AVRO.decodeBlob(blob)
谢谢!
下面是我的avro/binary与axios的集成,以防它帮助其他人试图实现浏览器端解码:
之前browserifying()
const axios = require('axios')
const avro = require('avsc')
const config = {
responseType: 'blob'
};
const url = 'https://some-url.com'
axios.get(url, config)
.then(res => {
avro.createBlobDecoder(res.data)
.on('metadata', (type) => console.log(type))
.on('data', (record) => console.log(record))
})
.catch(e => console.error(e))