OrientJS: Храните двоичные данные вместе с "нормальными" атрибутами
Я хотел бы использовать OrientDB в качестве базы данных для файлов.csv и сохранять их в исходном виде в двоичном поле записи, используя OrientJS. Кроме того, я хотел бы сохранить имя и описание в виде строк. Я работал с документацией и смог хранить сырые двоичные записи через
var fs = require('fs');
var testcsv = fs.readFile('test.csv',
function(error, data){
if(error) throw error;
var binary = new Buffer(data);
binary['@type'] = 'b';
binary['@class']='CSV';
db.record.create(binary);
})
Однако я не нашел способа сохранить запись с полем типа "Бинарный". Я пробовал несколько способов, которые, похоже, не работают. Например:
var fs = require('fs');
var testcsv = fs.readFile('test.csv',
function(error, data){
if(error) throw error;
var binary = new Buffer(data);
binary['@type'] = 'b';
binary['@class']='CSV';
db.record.create({
'@class': 'Test',
'file': binary,
'name': 'X',
'description': 'Y'
});
})
Если 'field' не объявлено как 'Binary', ему по умолчанию присваивается тип 'Embedded', а файл.csv "сохраняется". Если 'field' объявлено как 'Binary', выдается ошибка:
Unhandled rejection OrientDB.RequestError: Error on unmarshalling field 'file' in record #22:-1 with value: file: ...
DB name="mydb"
at child.Operation.parseError (...node_modules\orientjs\lib\transport\binary\protocol33\operation.js:864:13)
at child.Operation.consume (...node_modules\orientjs\lib\transport\binary\protocol33\operation.js:455:35)
at Connection.process (...node_modules\orientjs\lib\transport\binary\connection.js:399:17)
at Connection.handleSocketData (...node_modules\orientjs\lib\transport\binary\connection.js:290:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:548:20)
Поскольку я пробовал много других способов, я остался невежественным. Я что-то неправильно понимаю? Помощь очень ценится!
0 ответов
Вот обходной путь, при котором двоичные файлы кодируются в base64
а затем сохраняется как строковое свойство.
Вот пример, в котором я кодирую svg
файл, а затем снова декодировать его после загрузки из базы данных:
// First npm install the following packages
npm install orientjs
npm install await-to-js
Затем создайте файл app.js
и запустите его:
const OrientDBClient = require("orientjs").OrientDBClient;
const to = require('await-to-js').default;
// EXAMPLE FILE: AN SVG IMAGE
var svg = `<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="5" fill="red" /></svg>`
connect().then(async function(db) {
// Add class to database
[err, result] = await to(
db.session.class.create('Example', 'V')
);
if (err) { console.error(err); };
// Add property image to class
[err, result] = await to(
db.session.command('CREATE PROPERTY Example.image STRING').all()
);
if (err) { console.error(err); };
// Add property name to class
[err, result] = await to(
db.session.command('CREATE PROPERTY Example.name STRING').all()
);
if (err) { console.error(err); };
// *****************************************************************
// ********************* USING BASE64 ENCODING *********************
// *****************************************************************
// Convert to base64
var buf = Buffer.from(svg, 'utf-8').toString("base64");
// Add node to class with image encoded as base64
[err, result] = await to(
db.session.insert().into('Example').set({image: buf, name: 'ABC'}).one()
);
if (err) { console.error(err); };
// Retrieve base64 encoded svg from database
[err, result] = await to(
db.session.select('image').from('Example').where({name: 'ABC'}).one()
);
if (err) { console.error(err); };
// Output svg XML to the console
var output = Buffer.from(result.image, 'base64');
console.log(output.toString('ascii'));
})
async function connect() {
// Connect to Server
[err,client] = await to(OrientDBClient.connect({
host: 'localhost', // Specify your host here
port: '2424' // Make sure you call the HTTP port
}));
if (err) {
console.log("Cannot reach OrientDB. Server is offline");
return false;
}
// Connect to Database.
[err,session] = await to(client.session({
name: 'demodb', // Name of your database
username: 'admin', // Username of your database
password: 'admin' // Password of your database
}));
if (err) {
console.log("Database doesn't exist.");
return false;
}
// Add handler
session.on('beginQuery', (obj) => {
console.log(obj);
});
// Check if session opens
console.log("Successfully connected to database.");
var graph = {client, session};
return graph;
}
Этот код создаст класс Example
который имеет свойства image
а также name
а затем создаст вершину, в которой svg
сохраняется как base64
закодированная строка. Он также показывает, как снова получить изображение в javascript.