Хранилище Blob System, которое предназначено для предотвращения конфликтов при использовании с распределенной файловой системой или сетью области хранения.
Пожалуйста, снимайтесь на GitHub / NPM и следите за обновлениями.
Примечание. Требуется node.js v12 или более поздней версии.
npm install scalable-blob-store --save
const os = require ( 'os' ) ;
const ulid = require ( 'ulid' ) . ulid ; // You need a unique ID generator function
const BlobStore = require ( 'scalable-blob-store' ) ;
const options = {
blobStoreRoot : os . tmpdir ( ) + '/blobs' , // Change this!
idFunction : ulid ,
dirDepth : 4 ,
dirWidth : 1000 ,
} ;
// Creating the blobStore Object
const blobStore = new BlobStore ( options ) ;
const result = await blobStore . createWriteStream ( ) ;
console . dir ( result ) ;
// Logs the result object which contains the blobPath and writeStream.
// Use the writeStream to save your blob.
// Store the blobPath in your database.
//
// result object will be similar to this:
// {
// blobPath: "/01CTZRTWMAD153V20K26S4Y0BW/01CTZRTWMBZW4SPR4E5QGGJYSH/01CTZRTWMB3QXZK04SYFY8ZJVR/01CTZS3KJYFPRQ34S3T15Y798S",
// writeStream: [WriteStream]
// }
//
// In this example the full file path for the blob would be something like this:
// /tmp/blobs/01CTZRTWMAD153V20K26S4Y0BW/01CTZRTWMBZW4SPR4E5QGGJYSH/01CTZRTWMB3QXZK04SYFY8ZJVR/01CTZS3KJYFPRQ34S3T15Y798S
//
// This is based on the blobStoreRoot + blobPath.Смотрите примеры Quick Start File для получения более подробной информации:
После исследования хранения пользовательских файлов или хранилища Blob для веб -приложения, над которым я работал, я обнаружил, что наиболее распространенное решение, используемое веб -разработчиками, - это хранение файлов с использованием поставщика облачных услуг. После создания учетной записи с такими поставщиками, как Amazon S3, Google Cloud Storage или Azure Storage, они просто спрятали все свои файлы приложений и каждые каждые приложения.
Я исследовал цену облачного хранилища и решил, что хочу бесплатную локальную версию, которая будет масштабироваться, если это необходимо.
Я посмотрел на ряд существующих решений, таких как Filestorage, но был недоволен масштабируемостью этих решений. Большинство предназначены только для одного сервера и вызывают конфликты записи, если распределенная файловая система, файловая система кластера, такая как Glusterfs, или сеть области хранения в качестве бэкэнд -файловой системы.
В длинном автомобильном путешествии я думал о решении для моего хранения Blob и разработала scalable-blob-store .
Для достижения масштабируемости в распределенной или реплицированной файловой системе scalable-blob-store не использует индексные файлы или другие базы данных для управления файлами на диске или системе хранения. Вместо этого сама файловая система используется для поиска последнего пути хранения на основе атрибута birthtime файловых систем (дата создания каталога).
После определения последнего пути количество файлов в каталоге подсчитывается, чтобы убедиться, что он остается под настроенным значением. Это должно предотвратить проблемы с производительностью диска, когда очень большое количество файлов хранятся в одном каталоге. Если количество элементов в каталоге становится слишком большим, определяется новый путь хранения.
Поскольку нет баз данных, используемых для управления файлами в корневом пути, вы должны поддерживать возвращаемое значение blobPath и метаданные о сохраненных файлах в вашей собственной базе данных.
Причина scalable-blob-store связанная с масштабируемой, связана с именом каталогов и файлов в вашей файловой системе. Каждый каталог и файл, сохраненные на диск, называются сгенерированным уникальным идентификатором на основе пользователя, определенного Funciton. Вы можете использовать любой уникальный генератор идентификаторов, такой как Ulid, CUID, UUID V4 или Mongodbs ObjectIds, и это лишь некоторые из них. Проверьте мой удивительный уникальный репозиторий идентификатора для получения дополнительных примеров. Слияние каталогов между серверами или дисками никогда не должно вызывать столкновения с именем файла.
Если используется реплицированная или кластерная файловая система, единственный конфликт, который может возникнуть, это когда один сервер читает файл, в то время как другой удаляет один и тот же файл. scalable-blob-store не пытается управлять этим конфликтом, однако это поднимет исключение.
Ниже приведены примеры структуры каталога, созданной scalable-blob-store .
Пример с помощью каталога CUID и имен файлов:
b lobs c ij50xia200pzzph3we9r62bi // ← Directory File ↓
b lobs c ij50xia300q1zph3m4df4ypz . . c ij50xiae00qgzph3i0ms0l2wПример с помощью каталога UUID и имен файлов:
b lobs 8 46a291f-9864-40bb-aefe-f29bdc73a761 // ← Directory File ↓
b lobs 8 46a291f-9864-40bb-aefe-f29bdc73a761 . . 8 b86b6fe-6166-424c-aed9-8faf1e62689e scalable-blob-store поддерживает параметры конфигурации, чтобы дать вам управление используемыми идентификаторами каталога и файлов, глубиной структуры каталога и шириной каталогов. Параметры по умолчанию дают 3 каталога, содержащие 1000 пунктов, предоставляя общее хранилище одного миллиарда файлов в структуре каталога.
Другие интересующие операционные точки:
dirWidth , создается следующий каталог.dirWidth , создается следующий родительский каталог.dirWidth , значение dirWidth игнорируется. Писать
На моем ноутбуке с диском M.2 SSD запуск сценария Test-FS.JS дает следующие результаты:
====================================================================================================
Testing scalable-blob-store with the following options:
blobStoreRoot: /tmp/blobs/test-fs
idFunction: ulid
dirDepth: 3
dirWidth: 1000
repeat: 10000
Beginning test...
====================================================================================================
Test complete.
====================================================================================================
{
blobStoreRoot: '/tmp/blobs/test-fs',
dirDepth: 3,
dirWidth: 1000,
runTimeMilliseconds: 83730,
totalDirectories: 12,
totalFiles: 10000,
totalBytes: 430000,
lastBlobPath: '/ckxwcwgwz0001lk9hgq8t9iup/ckxwcwgx00002lk9h6tbpdmq1/ckxwcy36m06yclk9hb0g92dwg/ckxwcy9ip07q4lk9h5uyl10k6'
}
====================================================================================================
Please remove /tmp/blobs/test-fs manually.
====================================================================================================
Читать
Читать производительность будет близка, если не такая же, как скорость диска.
Все методы Blobstore в scalable-blob-store возвращают обещание. Это идеально подходит для использования с языковыми функциями Async/wat.
| API | Тип | Возврат |
|---|---|---|
| Новый Blobstore (варианты) | Конструктор | Экземпляр Blobstore |
| Blobstore.blobstoreroot | Читать только недвижимость | String |
| blobstore.idfunction | Читать только недвижимость | Function |
| Blobstore.dirdepth | Читать только недвижимость | Number |
| Blobstore.dirwidth | Читать только недвижимость | Number |
| blobstore.getCurrentBlobdir () | Метод | Promise<String> |
| blobstore.setCurrentBlobdir (blobdir) | Метод | Promise<undefined> |
| blobstore.createwritestream () | Метод | Promise<Object> |
| blobstore.write (data, writeptions) | Метод | Promise<String> |
| Blobstore.append (Blobpath, Data, Appendoptions) | Метод | Promise<undefined> |
| Blobstore.copy (Blobpath, Flags) | Метод | Promise<String> |
| blobstore.createreadstream (Blobpath) | Метод | Promise<ReadStream> |
| Blobstore.read (Blobpath, Readoptions) | Метод | Promise<data> |
| Blobstore.open (Blobpath, Flags, Mode) | Метод | Promise<FileHandle> |
| Blobstore.Realpath (Blobpath, RealPathoptions) | Метод | Promise<String> |
| blobstore.stat (blobpath) | Метод | Promise<Stats> |
| Blobstore.exists (Blobpath) | Метод | Promise<Boolean> |
| Blobstore.remove (Blobpath) | Метод | Promise<undefined> |
new BlobStore(options)Тип: Функция конструктора.
Параметр: options как Object .
Возврат : новый объект BlobStore , который будет использоваться для хранения данных.
Описание:
Вы можете позвонить в new BlobStore(options) несколько раз, чтобы создать более одного магазина Blob.
Параметры передаются в функцию конструктора как object JavaScript.
| Ключ | Описание | По умолчанию |
|---|---|---|
blobStoreRoot | Корневый каталог для хранения каплей | Необходимый |
idFunction | Любая функция идентификатора, которая возвращает уникальную идентификационную строку | Необходимый |
dirDepth | Насколько глубоко вы хотите каталоги под корнем | 3 |
dirWidth | Максимальное количество файлов или каталогов в каталоге | 1000 |
Пример:
// Start by requiring the `scalable-blob-store` constructor function:
const BlobStore = require ( 'scalable-blob-store' ) ;
// You will need a unique ID function
const uuid = require ( 'uuid' ) ;
// Create the options object
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
// Create a blob store using the options `object`:
const blobStore = new BlobStore ( options ) ;Создание нескольких магазинов Blob:
const userOptions = {
blobStoreRoot : '/app/blobs/user' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
const pdfOptions = {
blobStoreRoot : '/app/blobs/pdf' ,
idFunction : uuid . v4 ,
dirDepth : 2 ,
dirWidth : 300 ,
} ;
const userFileStore = new BlobStore ( userOptions ) ;
const pdfDocumentStore = new BlobStore ( pdfOptions ) ;blobStoreRootТип: Читать только свойство.
Возврат: String , которая соответствует вашим options.blobStoreRoot .
Описание:
Это удобное свойство, которое позволяет вам передать объект Blobstore в подмодуль и при этом иметь доступ к настроенным свойствам.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
console . log ( blobStore . blobStoreRoot ) ;
// Outputs '/app/blobs' which you configured in the optionsidFunctionТип: Читать только свойство.
Возврат: уникальная функция идентификатора, которую вы настроили в значении options.idFunction .
Описание:
Это удобное свойство, которое позволяет вам передать объект Blobstore в подмодуль и при этом иметь доступ к настроенным свойствам.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
console . log ( blobStore . idFunction ( ) ) ;
// Outputs 'bac00ab2-5e6d-4b77-bfa4-e9befc3e4279' which is a generated UUID from the idFunction.dirDepthТип: Читать только свойство.
Возвращает: Number , который соответствует вашим options.dirDepth .
Описание:
Это удобное свойство, которое позволяет вам передать объект Blobstore в подмодуль и при этом иметь доступ к настроенным свойствам.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
console . log ( blobStore . dirDepth ) ;
// Outputs '4' which you configured in the optionsdirWidthТип: Читать только свойство.
Возврат: Number , который соответствует вашим options.dirWidth .
Описание:
Это удобное свойство, которое позволяет вам передать объект Blobstore в подмодуль и при этом иметь доступ к настроенным свойствам.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 4 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
console . log ( blobStore . dirWidth ) ;
// Outputs '2000' which you configured in the optionsgetCurrentBlobDir()Тип: Метод.
Возврат: Promise , которое разрешает String , которая является текущим каталогом создания активного Blob.
Описание:
Эта функция используется внутри BlobStore для определения каталога, в котором следующий файл Blob будет сохранен на диск.
Если вам когда -нибудь нужно хранить файл Blob за пределами BlobStore вы можете использовать этот метод, чтобы найти правильное место для размещения вашего файла.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
console . log ( await blobStore . getCurrentBlobDir ( ) ) ;
// The 'dirDepth' option above is set to 3 so the output will be similar to the following:
// '/e44d3b0d-b552-4257-8b64-a53331184c38/443061b9-bfa7-40fc-a5a9-d848bc52155e/4d818f4c-88b3-45fd-a104-a2fc3700e9de'
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;setCurrentBlobDir(blobDir)Тип: Метод.
Параметры: blobDir как String .
blobStoreRoot . Возвращение: Promise , которое разрешается undefined .
Описание:
Эту функцию можно использовать для направления BlobStore для сохранения новых файлов Blob в желаемой blobPath .
Одна из проблем с scalable-blob-store заключается в том, что если вы удалите много файлов Blob, каталоги, в которых были расположены файлы, не будут удалены. Вы можете либо удалить каталоги самостоятельно, либо передать их новыми файлами Blob, установив текущий каталог активных Blob.
Эта функция была добавлена, чтобы потребители этого модуля работали вокруг пустых каталогов.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
console . log ( await blobStore . getCurrentBlobDir ( ) ) ;
// The 'dirDepth' option above is set to 3 so the output will be similar to the following:
// '/e44d3b0d-b552-4257-8b64-a53331184c38/443061b9-bfa7-40fc-a5a9-d848bc52155e/4d818f4c-88b3-45fd-a104-a2fc3700e9de'
await blobStore . setCurrentBlobDir ( '/some/blob/path' ) ;
console . log ( await blobStore . getCurrentBlobDir ( ) ) ;
// Outputs '/some/blob/path' to the console.
// Any new blob files added to the blob store will go into this path until there are `dirWidth` or 2000 files within it.
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;createWriteStream()Тип: Метод.
Возвращает : Promise , которое разрешается Object , содержащим путь дочернего пути, в файл в корне хранилища Blob и writeStream.
Описание:
Вот экзам возвращаемого объекта с использованием UUID в качестве идфункции:
{
blobPath : "/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19" ,
writeStream : stream . Writable
} Используйте writeStream , чтобы сохранить свой каплей или файл. blobPath необходимо сохранить в вашей базе данных для будущего доступа.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
// The below readStream is simply to make this a complete example
const fs = require ( 'fs' ) ;
const readStream = fs . createReadStream ( '/path/to/file' ) ;
async function main ( ) {
let result ;
try {
result = await blobStore . createWriteStream ( ) ;
} catch ( err ) {
console . error ( err ) ;
}
console . dir ( result ) ;
// result object will be similar to this:
// {
// blobPath: "/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19",
// writeStream: [WriteStream]
// }
// Using a Promise to encapsulate the write asynchronous events.
await new Promise ( ( resolve , reject ) => {
result . writeStream . on ( 'finish' , ( ) => {
resolve ( ) ;
} ) ;
result . writeStream . on ( 'error' , reject ) ;
readStream . pipe ( result . writeStream ) ;
} ) ;
console . log ( blobPath ) ;
// Logs the blobPath. Save this in your database.
}
main ( ) ;write(data, writeOptions)Тип: Метод.
Параметр: data как String , Buffer , TypedArray или DataView .
Параметр: writeOptions как Object .
writeOptions поддерживает свойство кодирования, режима и флага. Возвращает: Promise , которое разрешается в String .
blobPath , которое требует совершения вашей базы данных.Описание:
Если у вас есть простые данные в памяти, а не поток данных, вы можете использовать этот метод для хранения данных в файле Blob.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
const data = 'The quick brown fox jumps over the lazy dog.' ;
try {
const blobPath = await blobStore . write ( data ) ;
// The returned blobPath will look something like this:
// '/e44d3b0d-b552-4257-8b64-a53331184c38/443061b9-bfa7-40fc-a5a9-d848bc52155e/4d818f4c-88b3-45fd-a104-a2fc3700e9de'
// Save it to your database.
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;append(blobPath, data, appendOptions)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Параметр: data как String или Buffer .
Параметр: appendOptions как Object .
appendOptions поддерживает свойство кодирования, режима и флага. Возврат: Promise , которое разрешается undefined .
Описание:
Используйте этот метод, чтобы добавить простые данные в памяти в конце файла Blob.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
const data = 'The quick brown fox jumps over the lazy dog.' ;
try {
await blobStore . append ( data ) ;
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;copy(blobPath, flags)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Параметр: flags как Number .
Возвращает: Promise , которое разрешается в String .
blobPath для копируемого файла Blob.Описание:
Используйте этот метод, чтобы создать копию существующего файла Blob.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
const blobPathSource =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const blobPathDest = await blobStore . copy ( blobPathSource ) ;
// Store your new blobPath into your application database
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;createReadStream(blobPath)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Возвращает : Promise , которое разрешается для ReadStream .
Описание:
Создает читаемый поток в файл Blob, расположенный в blobPath .
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
async function main ( ) {
// Get the blobPath value from your database.
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19h' ;
let readStream ;
try {
readStream = await blobStore . createReadStream ( blobPath ) ;
} catch ( err ) {
console . error ( err ) ;
}
readStream . on ( 'error' , ( err ) => {
console . error ( err ) ;
} ) ;
// Blob contents is piped to the console.
readStream . pipe ( process . stdout ) ;
}
main ( ) ;read(blobPath, readOptions)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Параметр: readOptions как Object .
Возвращает: Promise , которое разрешается содержимым файла Blob.
scalable-blob-store устанавливает значение readOptions.encoding в «UTF8» по умолчанию.Описание:
Используйте этот метод, чтобы прочитать содержимое небольшого файла Blob в память.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const content = await blobStore . read ( blobPath ) ;
// Do something with the content
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;open(blobPath, flags, mode)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Параметр: flags как String или Number .
Возвращает: Promise , которое разрешается объектом FileHandle.
Описание:
Это более продвинутый метод, позволяющий выполнять множество файловых операций против файла Blob.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const fileHandle = await blobStore . open ( blobPath ) ;
// Do something with the file handle object
// See the documentation for more detail
// The documentation link is in the description above
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;realPath(blobPath, realPathOptions)Тип: Метод.
Параметр: blobPath как String .
blobPath из вашей базы данных приложений. Параметр: realPathOptions как String или Object .
Возвращает: Promise , которое разрешается в String .
Описание:
Используйте этот метод, чтобы найти файл Blob в файловой системе. Этот метод не должен понадобиться, потому что вы можете определить полный путь файла Blob. Просто объедините значения Blobstoreroot и Blobpath.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const fsPath = await blobStore . realPath ( blobPath ) ;
// With the above options the result will be similar to this:
// '/app/blobs/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;stat(blobPath)Тип: Метод.
Параметр: blobPath как String .
Возвращает: Object статистики.
Описание:
Вместо того, чтобы разрабатывать объект stats файловой системы, scalable-blob-store возвращает объект необработанной stats .
Больше подробностей класса стат можно найти в Википедии.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const stats = await blobStore . stat ( blobPath ) ;
console . dir ( stats ) ;
// Console output will be similar to the following.
// { dev: 2050,
// mode: 33188,
// nlink: 1,
// uid: 1000,
// gid: 1000,
// rdev: 0,
// blksize: 4096,
// ino: 6707277,
// size: 44,
// blocks: 8,
// atime: Mon Oct 12 2015 08:51:29 GMT+1000 (AEST),
// mtime: Mon Oct 12 2015 08:51:29 GMT+1000 (AEST),
// ctime: Mon Oct 12 2015 08:51:29 GMT+1000 (AEST),
// birthtime: Mon Oct 12 2015 08:51:29 GMT+1000 (AEST) }
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;exists(blobPath)Тип: Метод.
Параметр: blobPath как String .
Возврат: Boolean
true если файл существует, в противном случае false .Описание:
Используйте этот метод для простого теста на существование файла Blob.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
const exists = await blobStore . exists ( blobPath ) ;
// The result will be either true or false depending if the blob file exists.
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;remove(blobPath)Тип: Метод.
Параметр: blobPath как String .
Возврат : undefined если ничего не пошло не так или файл не существовало.
Описание:
Используйте этот метод, чтобы удалить файл Blob. Этот метод не может быть использован для удаления каталогов.
Пример:
const BlobStore = require ( 'scalable-blob-store' ) ;
const uuid = require ( 'uuid' ) ;
const options = {
blobStoreRoot : '/app/blobs' ,
idFunction : uuid . v4 ,
dirDepth : 3 ,
dirWidth : 2000 ,
} ;
const blobStore = new BlobStore ( options ) ;
async function main ( ) {
try {
// Retrieve the blobPath value from your database
const blobPath =
'/e6b7815a-c818-465d-8511-5a53c8276b86/aea4be6a-9e7f-4511-b394-049e68f59b02/fea722d1-001a-4765-8408-eb8e0fe7dbc6/183a6b7b-2fd6-4f80-8c6a-2647beb7bb19' ;
await blobStore . remove ( blobPath ) ;
// The blob file will no longer exist
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ; В scalable-blob-store есть небольшая проблема. Если добавлено большое количество файлов Blob, а затем удалено из хранилища Blob, у вас могут быть пустые каталоги или каталоги с небольшим количеством файлов в них. Эти каталоги никогда не будут удалены и не будут заполнены.
Если вы хотите предотвратить пустые или малонаселенные каталоги, вам необходимо запустить задачу по обслуживанию против каталога blobStoreRoot . Эта задача по обслуживанию необходимо будет искать пустые или неполные каталоги и вызвать метод SetCurrentBlobdir, проходящий в пустой blobPath .
Для вашего приложения вы можете найти вас редко удалять большое количество файлов Blob. Если это так, то эту проблему можно игнорировать.
Существует два метода для тестирования scalable-blob-store :
os.tmpdir() . После клонирования scalable-blob-store , введите следующее в консоли:
npm install
npm test
Запуск файла Test-FS.JS создаст каталог ~/blobs во временном каталоге, а затем повторно заполнит его множеством каплей.
Параметры по умолчанию, настроенные в файле test-fs.js :
const opts = {
blobStoreRoot : os . tmpdir ( ) + '/blobs' ,
idFunction : cuid ,
dirDepth : 3 ,
dirWidth : 1000 ,
} ;
const repeat = 10000 ;Измените варианты, если вы хотите увидеть разные результаты.
После клонирования scalable-blob-store , введите следующее в консоли:
npm install
node ./tests/test-fs.js
После завершения проверьте каталог /tmp/blobs . Я предлагаю использовать команду Tree , которая дает вам краткое изложение каталогов и файлов в целевом каталоге.
tree ~ /blobs
tree -d ~ /blobs
Я, Грант Картью, технолог из Квинсленда, Австралия. Я работаю над кодом в ряде личных проектов, и когда возникает необходимость, я строю свои собственные пакеты.
Этот проект существует, потому что мне нужен был местный магазин Blob, который мог бы масштабироваться.
Все, что я делаю в открытом исходном коде, делается в мое собственное время и в качестве вклада в сообщество с открытым исходным кодом.
Если вы используете мои проекты и хотели бы поблагодарить меня или поддержать меня, пожалуйста, нажмите на ссылку Patreon ниже.
Смотрите другие мои проекты на NPM.
git checkout -b my-new-featuregit commit -am 'Add some feature'git push origin my-new-featurenode-uuid с помощью uuid .ES5 . Удаленные требования к двигателю Nodejs.return null операторов.return null после разрешения/отклонения вызовов для предотвращения предупреждений Bluebird.es5dist для более старых версий узла. Пакеты обновлены.Грань