Хранение бинарных объектов
RethinkDB поддерживает собственный тип бинарных объектов, позволяя использовать ReQL для непосредственного хранения бинарных объектов в базе данных. Драйвер ReQL прозрачно переводит между типом ReQL и буферами Node.js Buffers.
Примечание: Тип бинарных объектов предназначен для данных, которые нельзя надёжно хранить как строки UTF-8, такие как загруженные файлы. Если вы работаете с данными, которые можно хранить как строки, обычно проще использовать тип данных строки.
Для этих примеров будем предполагать, что подключение к RethinkDB доступно как conn.
Хранение загруженных файлов в базе данных
Для веб-приложений распространённой задачей является прием загрузки файлов от пользователей; с RethinkDB вы можете сохранять эти файлы непосредственно в базе данных.
var fs = require('fs');
function saveFile(filePath, saveName, userId, callback) {
fs.readFile(filePath, function(err, contents) {
if (err) return callback(err);
r.table('files').insert({
userId: userId,
filename: saveName,
file: contents // contents is a buffer, so we do not need to wrap it in `r.binary`
}).run(conn, callback)
}
}
В saveFile, мы передаём путь к загруженному файлу (который может находиться в временной папке хранения, даже с временным именем в зависимости от библиотеки загрузки, которую мы использовали), имя для сохранения файла и идентификатор пользователя, который загрузил файл. Команда ReQL binary используется для хранения содержимого файла как бинарного объекта в поле file.
function getUserFileIDs(userId, callback) {
r.table('files').filter({userId: userId}).pluck('id', 'filename').run(conn, callback)
}
function getFile(fileId, callback) {
r.table('files').get(fileId).pluck('file', 'filename').run(conn, callback)
}
Затем, есть две функции для извлечения файлов: одна для извлечения каталога загруженных файлов пользователя (getUserFileIDs) и одна для извлечения самого файла (getFile). Нам не нужно использовать binary снова здесь; драйвер ReQL вернёт правильный тип данных для поля file в нашем объекте.
Хранение аватаров пользователей
Вот ещё один, более интересный пример: добавление аватаров Gravatar к учётным записям пользователей. Мы можем использовать http для их получения.
// https://www.npmjs.org/package/MD5
var md5 = require('MD5');
function addGravatar(userId, callback) {
r.table('users').get(userId)('email').run(conn, function (err, email) {
if (err) return callback(err);
hash = md5(email);
gravatarUrl = 'http://gravatar.com/avatar/' + hash + '?d=retro';
r.table('users').get(userId).update({
gravatar: r.http(gravatarUrl, {resultFormat: 'binary'})
}).run(conn, callback)
}
}
Где r.binary? Вам это не нужно в этом случае, потому что r.http вернёт бинарный объект с опцией {resultFormat: 'binary'}. (Если тип MIME на сервере-отправителе установлен правильно, вы даже можете этого не указывать, и r.http определит правильный тип.)
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/storing-binary/javascript/