分散ファイルシステムまたはストレージエリアネットワークで使用すると競合を防ぐように設計されたファイルシステムブロブストア。
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.詳細については、クイックスタートサンプルファイルを参照してください。
私が取り組んでいたWebアプリケーションのユーザーファイルストレージまたはBLOBストレージを調査した後、Web開発者が使用する最も一般的なソリューションは、クラウドサービスプロバイダーを使用してファイルを保存することであることを発見しました。 Amazon S3、Google Cloudストレージ、Azureストレージなどのプロバイダーを使用してアカウントを作成した後、すべてのアプリケーションファイルとブロブをそこに隠します。
クラウドストレージの価格を調査し、必要に応じてスケーリングする無料のローカルバージョンが必要になりました。
Filestorageなどの多くの既存のソリューションを見ましたが、これらのソリューションのスケーラビリティに不満を抱いていました。ほとんどは単一のサーバー用にのみ設計されており、分散ファイルシステム、GlusterFなどのクラスターファイルシステム、またはストレージエリアネットワークがバックエンドファイルシステムとして使用された場合、競合を書き込みします。
長い車旅行で、私は私のブロブストレージのソリューションについて考えていて、 scalable-blob-storeを思いつきました。
分散または複製されたファイルシステムでスケーラビリティを実現するために、 scalable-blob-storeは、インデックスファイルやその他のデータベースを使用して、ディスクまたはストレージシステム上のファイルを管理しません。代わりに、ファイルシステム自体を使用して、ファイルシステムのbirthtime属性(ディレクトリの作成日)に基づいて最新のストレージパスを見つけます。
最新のパスが決定されると、ディレクトリ内のファイルの数がカウントされ、設定された値の下にあることを確認します。これは、非常に多数のファイルが単一のディレクトリ内に保存されている場合にディスクのパフォーマンスの問題を防ぐためです。ディレクトリ内のアイテムの数が大きくなりすぎると、新しいストレージパスが決定されます。
ルートパスのファイルを管理するために使用されるデータベースはないため、自分のデータベースに保存されているファイルについて、返されたblobPath値とメタデータを維持するのはあなた次第です。
scalable-blob-storeがスケーラブルである理由は、ファイルシステム内のディレクトリとファイルの命名によるものです。ディスクに保存されたすべてのディレクトリとファイルは、ユーザー定義のファンシトンに基づいた生成された一意のIDによって名前が付けられています。いくつかの名前を付けて、ulid、cuid、uuid v4、mongodbs objectidsなどの一意のIDジェネレーターを使用できます。その他の例については、私の素晴らしいユニークなIDリポジトリをご覧ください。サーバーまたはディスク間の融合ディレクトリは、ファイル名の衝突を引き起こさないでください。
複製されたまたはクラスターファイルシステムが使用されている場合、発生する可能性のある競合は、あるサーバーがファイルを読み取り、別のサーバーが同じファイルを削除している場合です。 scalable-blob-storeこの競合を管理しようとはしませんが、例外が生まれます。
以下はscalable-blob-storeによって作成されたディレクトリ構造の例です。
cuidディレクトリとファイル名の例:
b lobs c ij50xia200pzzph3we9r62bi // ← Directory File ↓
b lobs c ij50xia300q1zph3m4df4ypz . . c ij50xiae00qgzph3i0ms0l2wUUIDディレクトリとファイル名を使用した例:
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構成オプションをサポートして、使用されるディレクトリとファイルID、ディレクトリ構造の深さ、およびディレクトリの幅を制御できます。デフォルトのオプションにより、3つのディレクトリが1000個のアイテムを含むディレクトリを提供し、ディレクトリ構造内の10億ファイルの合計ストレージを提供します。
他の運用上の関心点:
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.
====================================================================================================
読む
読み取りパフォーマンスは、ディスク速度と同じではないにしても、近くになります。
scalable-blob-store内のすべてのブロブストアメソッドは、約束を返します。これは、Async/待望の言語機能を使用するのに最適です。
| API | タイプ | 返品 |
|---|---|---|
| 新しいブロブストア(オプション) | コンストラクタ | 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、writeoptions) | 方法 | Promise<String> |
| blobstore.append(blobpath、data、azponptions) | 方法 | 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)タイプ:コンストラクター機能。
パラメーター: Objectとしてのoptions 。
返品:データを保存するために使用される新しいBlobStoreオブジェクト。
説明:
new BlobStore(options)を複数回呼び出して、複数のブロブストアを作成できます。
オプションは、JavaScript objectとしてコンストラクター機能に渡されます。
| 鍵 | 説明 | デフォルト |
|---|---|---|
blobStoreRoot | ブロブを保存するルートディレクトリ | 必須 |
idFunction | 一意のID文字列を返すID関数 | 必須 |
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 ) ;複数のブロブストアの作成:
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タイプ:読み取り専用プロパティ。
返品: options.blobStoreRoot値に一致するString 。
説明:
これは、ブロブストアオブジェクトをサブモジュールに渡すことができ、構成されたプロパティにアクセスできるようにするための便利なプロパティです。
例:
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値で構成した一意のID関数。
説明:
これは、ブロブストアオブジェクトをサブモジュールに渡すことができ、構成されたプロパティにアクセスできるようにするための便利なプロパティです。
例:
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タイプ:読み取り専用プロパティ。
返品: options.dirDepth値に一致するNumber 。
説明:
これは、ブロブストアオブジェクトをサブモジュールに渡すことができ、構成されたプロパティにアクセスできるようにするための便利なプロパティです。
例:
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タイプ:読み取り専用プロパティ。
返品: options.dirWidth値に一致するNumber 。
説明:
これは、ブロブストアオブジェクトをサブモジュールに渡すことができ、構成されたプロパティにアクセスできるようにするための便利なプロパティです。
例:
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()タイプ:メソッド。
返品:現在のアクティブブロブ作成ディレクトリであるStringに解決するPromise 。
説明:
この関数は、 BlobStoreによって内部的に使用され、次のBLOBファイルがディスクに保存されるディレクトリを決定します。
BlobStoreの外側に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'
} catch ( err ) {
console . error ( err ) ;
}
}
main ( ) ;setCurrentBlobDir(blobDir)タイプ:メソッド。
パラメーター: StringとしてのblobDir 。
blobStoreRootパスの下にあるBlobファイルを保存したいファイルシステムディレクトリパスを表します。返品: undefinedに解決するPromise 。
説明:
この関数を使用して、 BlobStoreガイドして、新しいブロブファイルを目的のblobPathに保存できます。
scalable-blob-storeの問題の1つは、多くのBLOBファイルを削除すると、ディレクトリがファイルにあるディレクトリが削除されないことです。現在のActive 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()タイプ:メソッド。
返品:Blobストアルート内のファイルへの子パスを含むObjectとWriteStrameのオブジェクトに解決するPromise 。
説明:
これは、IDFunctionとして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を使用して、blobまたはファイルを保存します。将来のアクセスのために、 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)タイプ:メソッド。
パラメーター: String 、 Buffer 、 TypedArray 、またはDataViewなどのdata 。
パラメーター: ObjectとしてのwriteOptions 。
writeOptionsオブジェクトは、エンコーディング、モード、およびフラグプロパティをサポートします。返品: Stringに解決するPromise 。
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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。パラメーター: StringまたはBufferとしてのdata 。
パラメーター: ObjectとしてのappendOptions 。
appendOptionsオブジェクトは、エンコード、モード、およびフラグプロパティをサポートします。返品: undefinedに解決するPromise 。
説明:
この方法を使用して、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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。パラメーター: Numberとしてflags 。
返品: Stringに解決するPromise 。
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 ( ) {
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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。返品: ReadStreamに解決するPromise 。
説明:
blobPathにあるBLOBファイルに読み取り可能なストリームを作成します。
例:
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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。パラメーター: ObjectとしてのreadOptions 。
返品: BLOBファイルの内容に解決するPromise 。
scalable-blob-store readOptions.encoding値をデフォルトで「UTF8」に設定します。説明:
この方法を使用して、小さなブロブファイルのコンテンツをメモリに読み取ります。
例:
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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。パラメーター: StringまたはNumberとしてflags 。
返品:ファイルハンドルオブジェクトに解決するPromise 。
説明:
これは、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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
blobPathを取得します。パラメーター: StringまたはObjectとしてのrealPathOptions 。
返品: Stringに解決するPromise 。
説明:
この方法を使用して、ファイルシステムに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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
返品:統計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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
リターン: 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)タイプ:メソッド。
パラメーター: StringとしてのblobPath 。
返品:何も間違っていない場合、またはファイルが存在しなかった場合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ディレクトリに対してメンテナンスタスクを実行する必要があります。このメンテナンスタスクは、空のディレクトリまたは不完全なディレクトリを探し、空のblobPathを渡すSetCurrentBlobdirメソッドを呼び出す必要があります。
アプリケーションでは、多数のBLOBファイルを削除することはめったにありません。この場合、この問題は無視できます。
scalable-blob-storeをテストする方法は2つあります。
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 ~ /blobs
tree -d ~ /blobs
私、グラントカーシューは、オーストラリアのクイーンズランド出身の技術者です。私は多くの個人プロジェクトでコードに取り組んでおり、必要に応じて自分のパッケージを構築します。
このプロジェクトは、スケーリングできる地元のブロブストアが必要だったために存在します。
私がオープンソースで行うことはすべて、自分の時間に、そしてオープンソースコミュニティへの貢献として行われます。
あなたが私のプロジェクトを使用していて、私に感謝したり、私をサポートしたい場合は、下の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を追加しました。es5distを追加しました。更新されたパッケージ。mit