Spec-Zone.ru › RethinkDB javascript

Хранение бинарных объектов

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API