متجر لقطات نظام الملفات المصمم لمنع التعارض عند استخدامه مع نظام الملفات الموزع أو شبكة مساحة التخزين.
يرجى النجوم على 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 لمزيد من التفاصيل:
بعد البحث عن تخزين ملفات المستخدم ، أو تخزين blob ، لتطبيق الويب الذي كنت أعمل عليه اكتشفت أن الحل الأكثر شيوعًا المستخدم من قبل مطوري الويب هو تخزين الملفات باستخدام مزود خدمة سحابة. بعد إنشاء حساب مع مقدمي الخدمات مثل Amazon S3 أو Google Cloud Storage أو Azure Storage ، يقومون فقط بتهدئة جميع ملفات التطبيقات والنقام هناك.
لقد بحثت عن سعر التخزين السحابي وقررت أنني أردت إصدارًا محليًا مجانيًا من شأنه أن يتوسع إذا لزم الأمر.
نظرت إلى عدد من الحلول الموجودة مثل Filestorage لكنني غير راضٍ عن قابلية التوسع في هذه الحلول. تم تصميم معظمها فقط لخادم واحد وسيتسبب في تعارضات في الكتابة إذا تم استخدام نظام ملفات موزع أو نظام ملفات الكتلة مثل GlusterFS أو شبكة مساحة التخزين كنظام ملفات الواجهة الخلفية.
في رحلة طويلة ، كنت أفكر في حل لتخزين النقطة الخاصة بي وتوصلت إلى scalable-blob-store .
لتحقيق قابلية التوسع على نظام ملفات موزعة أو متكررة ، لا يستخدم scalable-blob-store ملفات الفهرس أو قواعد البيانات الأخرى لإدارة الملفات على نظام القرص أو نظام التخزين. بدلاً من ذلك ، يتم استخدام نظام الملفات نفسه للعثور على أحدث مسار تخزين استنادًا إلى سمة birthtime أنظمة الملفات (تاريخ إنشاء الدليل).
بمجرد تحديد آخر مسار ، يتم حساب عدد الملفات داخل الدليل للتأكد من بقائه تحت القيمة المكونة. هذا هو منع مشكلات أداء القرص عندما يتم تخزين أعداد كبيرة جدًا من الملفات داخل دليل واحد. إذا أصبح عدد العناصر الموجودة داخل الدليل أكبر من اللازم ، يتم تحديد مسار تخزين جديد.
نظرًا لعدم وجود قواعد بيانات تستخدم لإدارة الملفات في مسار الجذر ، فإن الأمر متروك لك للحفاظ على قيمة blobPath التي تم إرجاعها والبيانات الوصفية حول الملفات المخزنة في قاعدة البيانات الخاصة بك.
السبب في أن scalable-blob-store قابل للتطوير يرجع إلى تسمية الدلائل والملفات داخل نظام الملفات الخاص بك. يتم تسمية كل دليل وملف يتم حفظه على القرص بواسطة معرف فريد تم إنشاؤه استنادًا إلى Funciton المحدد للمستخدم. يمكنك استخدام أي مولد ID فريد مثل Onger أو Cuid أو UUID V4 أو Mongodbs فقط على سبيل المثال لا الحصر. تحقق من مستودع ID الفريد الرائع لمزيد من الأمثلة. يجب ألا يتسبب دمج الدلائل بين الخوادم أو الأقراص في تصادم اسم الملف.
إذا كان نظام الملفات المتكرر أو الكتلة قيد الاستخدام ، فإن الصراع الوحيد الذي يمكن أن يحدث هو عندما يقرأ خادم أحد الملفات بينما يقوم الآخر بإزالة نفس الملف. لا يحاول 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 تعود الوعد. هذا مثالي لاستخدام مع ميزات اللغة غير المتزامنة/في انتظار.
| API | يكتب | عودة |
|---|---|---|
| New 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 (البيانات ، الكتابة) | طريقة | Promise<String> |
| blobstore.append (blobpath ، البيانات ، التذييلات) | طريقة | Promise<undefined> |
| blobstore.copy (blobpath ، أعلام) | طريقة | Promise<String> |
| blobstore.createadstream (blobpath) | طريقة | Promise<ReadStream> |
| blobstore.read (blobpath ، readoptions) | طريقة | Promise<data> |
| blobstore.open (blobpath ، أعلام ، وضع) | طريقة | 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 هي دليل إنشاء النقطة النشطة الحالية.
وصف:
يتم استخدام هذه الوظيفة داخليًا بواسطة 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 و Orbestream.
وصف:
فيما يليمكمب من الكائن الذي تم إرجاعه باستخدام 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 نظام File System ، يقوم scalable-blob-store بإرجاع كائن stats RAW.
يمكن العثور على المزيد من تفاصيل فئة الإحصائيات على ويكيبيديا.
مثال:
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-F.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 بعد حل المكالمات/رفضه لمنع تحذيرات Bluebird.es5dist للإصدارات القديمة من العقدة. تم تحديث الحزم.معهد ماساتشوستس للتكنولوجيا