Skip to content

Latest commit

 

History

History
481 lines (364 loc) · 26.5 KB

README.md

File metadata and controls

481 lines (364 loc) · 26.5 KB

ሞባይልቶ

ሞባይልቶ የጃቫ ስክሪፕት ማከማቻ አብስትራክት ንብርብር ነው፣ ከአማራጭ ግልጽ የደንበኛ ጎን ምስጠራ።

ይዘቶች

ይህንን በሌላ ቋንቋ ያንብቡ

ይህ README.md ሰነድ በhokeylization በኩል ተተርጉሟል፣ ወደ ሁሉም ቋንቋ በGoogle ትርጉም ይደገፋል!

ፍጹም እንዳልሆነ እርግጠኛ ነኝ፣ ግን ከምንም የተሻለ እንደሚሆን ተስፋ አደርጋለሁ!

🇸🇦 አረብኛ 🇧🇩 ቤንጋሊ 🇩🇪 ጀርመንኛ 🇺🇸 እንግሊዝኛ 🇪🇸 ስፓኒሽ 🇫🇷 ፈረንሳይኛ 🇹🇩 ሃውሳ 🇮🇳 ሂንዲ 🇮🇩 ኢንዶኔዥያ 🇮🇹 ጣልያንኛ 🇯🇵 ጃፓንኛ 🇰🇷 ኮሪያኛ 🇮🇳 ማራንቲ 🇵🇱 ፖላንድኛ 🇧🇷 ፖርቱጋልኛ 🇷🇺 ሩሲያኛ 🇰🇪 ስዋሂሊ 🇵🇭 ታጋሎግ 🇹🇷 ቱርክኛ 🇵🇰 ኡርዱ 🇻🇳 ቬትናምኛ 🇨🇳 ቻይንኛ

በዚህ የ README ትርጉም ላይ ችግር አለ?

ይህ ልዩ የዋናው README ትርጉም ጉድለት ያለበት ሊሆን ይችላል -- ማስተካከያዎች በጣም እንኳን ደህና መጡ! እባክዎን በGitHub ላይ የመጎተት ጥያቄ ይላኩ ወይም ያንን ማድረግ ካልተመቸዎ፣ ችግር ይክፈቱ

ስለ አንድ ትርጉም አዲስ የ GitHub ጉዳይ ሲፈጥሩ፣ እባክዎን ያድርጉ፡

  • የገጹን ዩአርኤል ያካትቱ (ከአሳሽ አድራሻ አሞሌ ቅዳ/ለጥፍ)
  • የተሳሳተ ትክክለኛውን ጽሑፍ ያካትቱ (ከአሳሹ ይቅዱ / ይለጥፉ)
  • እባክዎን ስህተት የሆነውን ይግለጹ -- ትርጉሙ ትክክል አይደለም? ቅርጸቱ እንደምንም ተሰብሯል?
  • የተሻለ ትርጉም ያለው ወይም ጽሑፉ እንዴት በትክክል መቀረጽ እንዳለበት በደግነት አስተያየት ይስጡ
  • አመሰግናለሁ!

ለምን Mobiletto?

ደህና ሁኑ የሻጭ መቆለፊያ!

የተለያዩ የደመና ማከማቻ አቅራቢዎች ተኳዃኝ ያልሆኑ ኤፒአይዎች አሏቸው። ለ "S3 ተኳሃኝነት" የሚጥሩትም እንኳን ፈሊጣዊ ጠባይ አላቸው።

ለመተግበሪያዎ የተለየ የማከማቻ አቅራቢን ሲመርጡ በቀጥታ ወደ ኤፒአይዎ ከገቡ መተግበሪያዎ አሁን በዚህ አገልግሎት ላይ የተመሰረተ ነው. ጊዜ እያለፈ ሲሄድ እና ኮድ ሲጠራቀም, ሻጮችን መቀየር ይሆናል እየጨመረ የማይሄድ. ወደ አስደሳች የሻጭ መቆለፊያ ዓለም እንኳን በደህና መጡ!

ሞባይልቶ ይህን ችግር ለመፍታት የተነደፈ ነው። መተግበሪያዎን ወደ mobiletto's API ኮድ በማድረግ በቀላሉ ይችላሉ። የማከማቻ አቅራቢዎችን ይቀይሩ እና የመተግበሪያዎ ማከማቻ ንብርብር ተመሳሳይ ባህሪ እንዳለው ይወቁ።

ሰፊ ሙከራ

ሁሉም አሽከርካሪዎች ለተመሳሳይ ባህሪ የሚፈተኑት ለእያንዳንዱ ሾፌር ከ60 በላይ ፈተናዎች ነው። ሁሉንም አሽከርካሪዎች በእያንዳንዱ ጥምረት እንሞክራለን፡-

  • ምስጠራ፡ ሁለቱም ነቅተዋል እና ተሰናክለዋል።
  • Redis መሸጎጫ፡ ሁለቱም ነቅተዋል እና ተሰናክለዋል።

ይህ አካሄድ የትኛውንም ሹፌር ቢጠቀሙ ሞባይልቶ ተመሳሳይ ባህሪ እንደሚኖረው የአእምሮ ሰላም ይሰጠናል። እና መሸጎጫ እና/ወይም ምስጠራን ቢያነቃቁ።

የአሽከርካሪ ድጋፍ

የአሁኑ የሞባይልቶ ማከማቻ ነጂዎች፡-

  • s3 : Amazon S3
  • b2 B2
  • local ፡ የአካባቢ የፋይል ስርዓት

ተጨማሪ የደመና ማከማቻ አቅራቢዎችን ለመደገፍ የሚደረጉት አስተዋጽዖዎች በጣም እንኳን ደህና መጡ!

ሞባይልቶ-ክሊ

ሞባይልቶ በሌላ የጃቫ ስክሪፕት ኮድ እንደ ቤተ-መጽሐፍት ለመጠቀም የታሰበ ነው።

በትእዛዝ መስመር ከሞባይልቶ ጋር ለመስራት mobiletto-cli ይጠቀሙ።

ምንጭ

ድጋፍ እና የገንዘብ ድጋፍ

ፕሮፌሽናል ክፍት ምንጭ ሶፍትዌር ገንቢ ለመሆን እየሞከርኩ ነው። ውስጥ እየሠራሁ ነበር የሶፍትዌር ኢንዱስትሪው ለብዙ ዓመታት ስኬታማ ኩባንያዎችን ጀምሬ ለሕዝብ ኩባንያዎች ሸጫለሁ። በቅርቡ ሥራ አጣሁ፣ እና ሌላ የተሠለፍኩት ሥራ የለኝም

ስለዚህ ጠቃሚ ሶፍትዌር ለመጻፍ እሞክራለሁ እና ያ እንደሚሰራ ለማየት እሞክራለሁ።

ይህን ሶፍትዌር መጠቀም ከወደዳችሁ፣ ለነገሩ እንኳን በጣም አመሰግናለሁ ትንሹ በፓትሪዮን በኩል ወርሃዊ መዋጮ

አመሰግናለሁ!

መጫን

npm ወይም yarn ን በመጠቀም ጫን። ሁሉንም lite እትም ትፈልጉ ይሆናል። የተተረጎሙ README ፋይሎች፡-

npm install mobiletto-lite
yarn add mobiletto-lite

የ README ፋይሎችን በሁሉም ቋንቋ ከፈለጉ፣ ሙሉውን ስሪት ይጫኑ፡-

npm install mobiletto
yarn add mobiletto

ፈጣን ጅምር

የሞባይል s3 ሾፌርን በመጠቀም አጭር ምሳሌ።

ሾፌሩ b2 ወይም local ከሆነ ይህ ኮድ ተመሳሳይ ነው።

const storage = require('mobiletto')
const bucket = await storage.connect('s3', aws_key, aws_secret, {bucket: 'bk'})

// list objects: returns array of metadata objects
const listing = await bucket.list()
const dirList = await bucket.list('some/dir/')
const everything = await bucket.list('', {recursive: true})

// write an entire file
let bytesWritten = await bucket.writeFile('some/path', someBufferOfData)

// write a file from a stream/generator
bytesWritten = await bucket.write('some/path', streamOrGenerator)

// read an entire file
// returns null if an exception would otherwise be thrown
const bufferOrNull = await bucket.safeReadFile('some/path')

// stream-read a file, passing data to callback
const bytesRead = await bucket.read('some/path', (chunk) => { ...do something with chunk... } )

// remove a file, returns the path removed
let removed = await bucket.remove('some/path') // removed is a string

// remove a directory, returns array of paths removed
removed = await bucket.remove('some/directory', {recursive: true}) // removed is now an array!

መሰረታዊ አጠቃቀም

የቀረቡትን አብዛኛዎቹን ባህሪያት የሚያሳይ የበለጠ ሰፊ ምሳሌ፡-

const { mobiletto } = require('mobiletto')

// General usage
const api = await mobiletto(driverName, key, secret, opts)

// To use 'local' driver:
// * key: base directory
// * secret: ignored, can be null
// * opts object:
// * readOnly: optional, never change anything on the filesystem; default is false
// * fileMode: optional, permissions used when creating new files, default is 0600. can be string or integer
// * dirMode: optional, permissions used when creating new directories, default is 0700. can be string or integer
const local = await mobiletto('local', '/home/ubuntu/tmp', null, {fileMode: 0o0600, dirMode: '0700'})

// To use 's3' driver:
// * key: AWS Access Key ID
// * secret: AWS Secret Key
// * opts object:
// * readOnly: optional, never change anything on the bucket; default is false
// * bucket: required, name of the S3 bucket
// * region: optional, the AWS region to communicate with, default is us-east-1
// * prefix: optional, all read/writes within the S3 bucket will be under this prefix
// * delimiter: optional, directory delimiter, default is '/' (note: always '/' when encryption is enabled)
const s3 = await mobiletto('s3', aws_key, aws_secret, {bucket: 'bk', region: 'us-east-1'})

// To use 'b2' driver:
// * key: Backblaze Key ID
// * secret: Backblaze Application Key
// * opts object:
// * readOnly: optional, never change anything on the bucket; default is false
// * bucket: required, the ID (**not the name**) of the B2 bucket
// * prefix: optional, all read/writes within the B2 bucket will be under this prefix
// * delimiter: optional, directory delimiter, default is '/' (note: always '/' when encryption is enabled)
// * partSize: optional, large files will be split into chunks of this size when uploading
const b3 = await mobiletto('b2', b2_key_id, b2_app_key, {bucket: 'bk', partSize: 10000000})

// List files
api.list() // --> returns an array of metadata objects

// List files recursively
api.list({ recursive: true })

// List files in a directory
const path = 'some/path'
api.list(path)
api.list(path, { recursive: true }) // also supports recursive flag

// Visit files in a directory -- visitor function must be async
api.list(path, { visitor: myAsyncFunc })
api.list(path, { visitor: myAsyncFunc, recursive: true })

// The `list` method throws MobilettoNotFoundError if the path does not exist
// When you call `safeList` on a non-existent path, it returns an empty array
api.safeList('/path/that/does/not/exist') // returns []

// Read metadata for a file
api.metadata(path) // returns metadata object

// The `metadata` method throws MobilettoNotFoundError if the path does not exist
// When you call `safeMetadata` on a non-existent path, it returns null
api.safeMetadata('/tmp/does_not_exist') // returns null

// Read a file
// Provide a callback that writes the data someplace
const callback = (chunk) => { ... write chunk somewhere ... }
api.read(path, callback) // returns count of bytes read

// Read an entire file at once
const data = await api.readFile(path) // returns a byte Buffer of the file contents

// Read an entire file at once
// returns null if an exception would otherwise be thrown
const bufferOrNull = await bucket.safeReadFile('some/path')

// Write a file
// Provide a generator function that yields chunks of data
const generator = function* () {
  while ( ... more-data-to-return ... ) {
    data = ... load-data ...
    yield data
  }
}
local.api(path, generator) // returns count of bytes written

// Write an entire file at once (convenience method)
await api.writeFile(path, bufferOrString) // returns count of bytes written

// Delete a file
// Quiet param is optional (default false), when set errors will not be thrown if the path does not exist
// Always returns a value or throws an error.
// Return value may be a single string of the file removed, or an array of all files removed (driver-dependent)
const quiet = true
api.remove(path, {quiet}) // returns single path removed

// Recursively delete a directory and do it quietly (do not report errors)
const recursive = true
const quiet = true
api.remove(path, {recursive, quiet}) // returns array of paths removed

ዲበ ውሂብ

metadata ትዕዛዙ ስለ አንድ ነጠላ የፋይል ስርዓት ግቤት ሜታዳታ ይመልሳል። በተመሳሳይ፣ ከ list ትዕዛዝ የሚገኘው የመመለሻ ዋጋ የሜታዳታ ዕቃዎች ድርድር ነው።

ሜታዳታ ነገር ይህን ይመስላል፡-

{
  "name": "fully/qualified/path/to/file",
  "type": "entry-type",
  "size": size-in-bytes,
  "ctime": creation-time-epoch-millis,
  "mtime": modification-time-epoch-millis
}

type ንብረቱ filedirlink ወይም special ሊሆን ይችላል።

እንደ ሾፌሩ አይነት list ትዕዛዝ ሁሉንም መስኮች ላይመልስ ይችላል። የ name እና የ type ባህሪያት ሁልጊዜ መገኘት አለበት. የሚቀጥለው metadata ትዕዛዝ ሁሉንም ያሉትን ንብረቶች ይመልሳል።

አማራጭ የማስመጣት ዘይቤ

ሙሉ በሙሉ ስፋት ያለው ሞጁሉን ያስመጡ እና የ connect ተግባርን ይጠቀሙ፡-

const storage = require('mobiletto')
const opts = {bucket: 'bk', region: 'us-east-1'}
const s3 = await storage.connect('s3', aws_key, aws_secret, opts)
const objectData = await s3.readFile('some/path')

መሸጎጫ

ሞባይልቶ ከሬዲስ መሸጎጫ ጋር በተሻለ ሁኔታ ይሰራል።

ሞባይልቶ በ127.0.0.1:6379 ላይ ከሪዲስ ምሳሌ ጋር ለመገናኘት ይሞክራል።

ከእነዚህ ውስጥ አንዱን መሻር ይችላሉ፡-

  • MOBILETTO_REDIS_HOST env var፣ mobiletto ከአካባቢው አስተናጋጅ ይልቅ እዚህ ይገናኙ
  • MOBILETTO_REDIS_PORT env var ያቀናብሩ፣ ይህ ወደብ ስራ ላይ ይውላል

Mobiletto ሁሉንም የዳግም ቁልፎቹን በቅድመ ቅጥያ _mobiletto__ ። ይህንን መቀየር ይችላሉ MOBILETTO_REDIS_PREFIX env var በማቀናበር።

እንዲሁም በየግንኙነት መሸጎጫውን በ opts.redisConfig ነገር ማቀናበር ትችላለህ፡-

const redisConfig = {
    enabled: true, // optional, default is true. if false other props are ignored
    host: '127.0.0.1',
    port: 6379,
    prefix: '_mobiletto__'
}
const opts = { redisConfig, bucket: 'bk', region: 'us-east-1' }
const s3 = await storage.connect('s3', aws_key, aws_secret, opts)

ሪዲስ መሸጎጫ አይፈልጉም?

ለማሰናከል፡ ግንኙነትዎን ሲፈጥሩ በ opts.redisConfig ውስጥ enabled: false ፡ ውሸት'ን ይለፉ።

ከዚህ በታች እንደተብራራው፣ መሸጎጫ ማሰናከል በአፈጻጸም ላይ አሉታዊ ተጽእኖ ይኖረዋል እና ተጨማሪ ጥያቄዎችን ያስከትላል በትክክል ወደሚፈልጉት ማከማቻ።

መሸጎጫ መመሪያ

የተመሰጠረ ማከማቻ፡ የተመሰጠረ ማከማቻ ማንበብ/መፃፍ ከመደበኛው ትንሽ ቀርፋፋ ነው። ነገር ግን ማውጫዎችን (አንዳንድ ነገሮች የሚሠሩትን) ማሰስ በጣም ውድ ነው። የ redis መሸጎጫ በመጠቀም ጉልህ የሆነ የአፈፃፀም መጨመር ይሰጥዎታል.

ነባሪው መሸጎጫ ደህንነቱ የተጠበቀ ነው፣ ነገር ግን ብዙ የመፃፍ/የማስወገድ ስራዎች ካሉዎት በደንብ አይሰራም። ማንኛውም የመጻፍ ወይም የማስወገድ ክዋኔ መላውን መሸጎጫ ዋጋ ያጠፋዋል፣ ይህም ተከታይ ንባቦች ያያሉ። የቅርብ ጊዜ ለውጦች.

CLI መሳሪያዎች

እንደ mobiletto-cli ያለ የCLI መሳሪያ እየተጠቀሙ ከሆነ mo ትዕዛዝ ጥሪዎች ሁሉ ስለሚቆይ የሪዲስ መሸጎጫ እንዲነቃ በእርግጥ ይፈልጋሉ።

ማንጸባረቅ

// Copy a local filesystem mobiletto to S3
s3.mirror(local)

// Mirror a local subdirectory from one mobiletto to an S3 mobiletto, with it's own subdirectory
local.mirror(s3, 'some/local-folder', 'some/s3-folder')

mirror ትዕዛዙ የአንድ ጊዜ የሁሉም ፋይሎች ከአንድ ሞባይል ወደ ሌላ ቅጂ ይሰራል። መስተዋቱን በጊዜ ሂደት ለማቆየት ምንም አይነት ሂደት አይሰራም. mirror ትዕዛዙን እንደገና ያሂዱ የጎደሉ ፋይሎችን ለማመሳሰል።

mirror ያለው የመመለሻ ዋጋ ስንት ፋይሎች በተሳካ ሁኔታ እንደነበሩ ቆጣሪ ያለው ቀላል ነገር ነው። የተንጸባረቀበት እና ስንት ፋይሎች ስህተቶች ነበሩት

{
  success: count-of-files-mirrored,
  errors: count-of-files-with-errors
}

ማስጠንቀቂያ፡ ትላልቅ የውሂብ ስብስቦችን ማንጸባረቅ ጊዜ የሚወስድ እና የመተላለፊያ ይዘትን የሚጠይቅ ሊሆን ይችላል።

በ‹መስታወት› የጥሪ ትርጉም አንዳንድ ጊዜ ማን እንደሆነ ለመረዳት ግራ mirror አንባቢ እና ማን ጸሐፊ ነው. እንደ አንድ የምደባ መግለጫ አስቡት፡ "የግራ እጅ ሞባይልቶ" የተመደበው ነገር (የተንጸባረቀ ውሂብ ተጽፏል) እና "የቀኝ እጅ ሞባይልቶ" (የ የ mirror ዘዴ) የሚቀርበው እሴት ነው (የመስታወት ውሂብ ይነበባል)።

ግልጽ ምስጠራ

ግልጽ ደንበኛ-ጎን ምስጠራን አንቃ፡-

// Pass encryption parameters
const encryption = {
  // key is required, must be >= 16 chars
  key: randomstring.generate(128),

  // optional, the default is to derive IV from key
  // when set, IV must be >= 16 chars
  iv: randomstring.generate(128),

  // optional, the default is aes-256-cbc
  algo: 'aes-256-cbc'
}
const api = await mobiletto(driverName, key, secret, opts, encryption)

// Subsequent write operations will encrypt data (client side) when writing
// Subsequent read operations will decrypt data (client side) when reading

ምን እየተደረገ ነው? የተለየ "የማውጫ ግቤት" (ዳይሬክት) ማውጫ (የተመሰጠረ) በዚያ ውስጥ ምን ፋይሎች እንዳሉ ይከታተላል ማውጫ (የቀጥታ ማውጫ)።

  • የ‹ዝርዝር› ትዕዛዙ list የመግቢያ ፋይሎች ያነባል ፣የተዘረዘረውን እያንዳንዱን መንገድ ዲክሪፕት ያደርጋል። ከዚያ ለእያንዳንዱ ፋይል ሜታዳታ ይመልሳል *"ዝርዝር" ትዕዛዞች የበለጠ ውጤታማ አይደሉም፣በተለይ ብዙ ቁጥር ያላቸው ፋይሎች list ማውጫዎች
  • write ትዕዛዙ በእያንዳንዱ ወላጅ የቀጥታ ማውጫ ውስጥ ቀጥተኛ ፋይሎችን ይጽፋል፣ በየጊዜው; ከዚያም ፋይሉን ይጽፋል
  • write ትእዛዞች O(N) ይጽፋሉ፣ N = ጥልቀት በማውጫ ተዋረድ
  • remove ትዕዛዙ ተጓዳኝ ፋይሉን ያስወግዳል፣ እና ወላጁ ባዶ ከሆነ፣ በተከታታይ፣ ከዚያም ፋይሉን ያስወግዳል
  • ያልተደጋገሙ remove ትእዛዞች O(N) ንባብ እና ብዙ ሊሰርዙ የሚችሉ ሲሆን N = ጥልቀት በማውጫ ተዋረድ
  • በትልልቅ እና ጥልቅ የፋይል ስርዓቶች ላይ ተደጋጋሚ remove ትዕዛዞች ውድ ሊሆኑ ይችላሉ።

ከደንበኛ-ጎን ምስጠራ በነቃ፣ በተመሳጠረ አገልጋይዎ ውስጥ ሙሉ ታይነት ያለው ባላጋራ መሆኑን ልብ ይበሉ ማከማቻ፣ ያለ ቁልፉም ቢሆን፣ አሁንም አጠቃላይ የማውጫዎችን ብዛት እና በእያንዳንዱ ውስጥ ስንት ፋይሎች እንዳሉ እና ከ ጋር ማየት ይችላል። የተወሰነ ጥረት፣ የማውጫ ተዋረድ አጠቃላይ መዋቅር ጥቂቱን ወይም ሁሉንም ያግኙ። ማስታወሻ፡ ለተሻለ ደህንነት በአንፃራዊነት ጠፍጣፋ መዋቅር ይጠቀሙ። ምስጠራህን እስካላወቀ ድረስ ባላጋራው የማውጫዎቹን/የፋይሎችን ስም አያውቀውም። ቁልፍ ወይም በሌላ መንገድ ምስጠራውን በተሳካ ሁኔታ ሰነጠቀው። ያኔ ሁሉም ውርርዶች ጠፍተዋል!

አፈጻጸም እና መሸጎጫ

ኢንክሪፕት የተደረገ ማከማቻ ላይ የሚሰሩ ስራዎች ቀርፋፋ ሊሆኑ ይችላሉ። ተደጋጋሚ ዝርዝሮች እና ማስወገጃዎች በጣም ቀርፋፋ ሊሆኑ ይችላሉ። በ redis በኩል መሸጎጥ በጣም ይረዳል፣ ነገር ግን መሸጎጫው በማንኛውም በሚጽፍ ወይም በሚያስወግድ ላይ እንደታጠበ ልብ ይበሉ።

ቁልፍ ማሽከርከር

በአዲሱ ቁልፍዎ ሞባይል ቶ ይፍጠሩ፣ ከዚያ የድሮውን ውሂብ ያንጸባርቁት፡-

const storage = require('mobiletto')

const oldEncryption = { key: .... }
const oldStorage = await storage.connect('s3', aws_key, aws_secret, {bucket: 'bk', region: 'us-east-1'}, oldEncryption)

const newEncryption = { key: .... }
const newStorage = await storage.connect('s3', aws_key, aws_secret, {bucket: 'zz', region: 'us-east-1'}, newEncryption)

newStorage.mirror(oldStorage) // if oldStorage is very large, this may take a looooooong time...

የአሽከርካሪ በይነገጽ

አሽከርካሪ ከዚህ ፊርማ ጋር የ'sstorageClient' ተግባር ወደ ውጭ የሚልክ ማንኛውም JS ፋይል ነው።

function storageClient (key, secret, opts)
  • key ፡ ሕብረቁምፊ፣ የእርስዎ ኤፒአይ ቁልፍ ( local ነጂ ይህ የመሠረት ማውጫ ነው)
  • secret ፡ ሕብረቁምፊ፣ የእርስዎ ኤፒአይ ሚስጥር ( local ነጂ ሊታለፍ ይችላል)
  • opts ፡ ዕቃ፣ ንብረቶቹ በአሽከርካሪዎች ናቸው
  • local ' የ fileMode እና dirMode ባህሪያት እንዴት አዲስ ፋይሎች እና ማውጫዎች እንደሚፈጠሩ ይወስናሉ።
  • s3 bucket ንብረት ያስፈልጋል። አማራጭ ንብረቶች የሚከተሉት ናቸው
    • region: the S3 region, default is us-east-1
    • prefix: a prefix to prepend to all S3 paths, default is the empty string
    • delimiter: the directory delimiter, default is '/'

የማከማቻ ደንበኛ ተግባር የሚመልሰው ነገር እነዚህን ተግባራት መግለፅ አለበት፡-

// Test the driver before using, ensure proper configuration
async testConfig ()

// List files in path (or from base-directory)
// If recursive is true, list recursively
// If visitor is defined, it will be an async function. await the visitor function on each file found
// Otherwise, perform the listing and return an array of objects
async list (path, recursive = false, visitor = null) // path may be omitted

// Read metadata for a path
async metadata (path)

// Read a file
// callback receives a chunk of data. endCallback is called at end-of-stream
async read (path, callback, endCallback = null)

// Write a file
// driver must be able to handle a generator or a stream
async write (path, generatorOrReadableStream)

// Remove a file, or recursively delete a directory
// returns a string of a single path removed, or an array of multiple paths removed
async remove (path, recursive = false, quiet = false)

##መመዝገብ ሞባይልቶ የ ዊንስተን የምዝግብ ማስታወሻ ላይብረሪ ይጠቀማል።

ምዝግብ ማስታወሻዎች ** የፋይል ዱካዎችን እና የስህተት መልዕክቶችን ይይዛሉ ፣ ግን ** በጭራሽ *** ቁልፎችን ፣ ሚስጥሮችን ፣ ወይም ሌላ ማንኛውም የግንኙነት ውቅር መረጃ.

የምዝግብ ማስታወሻ ደረጃ

የምዝግብ ማስታወሻውን ደረጃ MOBILETTO_LOG_LEVEL አካባቢ ተለዋዋጭ ተጠቀም፣ አንዱን በመጠቀም በhttps://www.npmjs.com/package/winston#logging-levels ውስጥ የተገለጹት npm ደረጃዎች

ነባሪው ደረጃ error ነው። ምንም እንኳን በአሁኑ ጊዜ ሞባይልቶ ቢሆንም በጣም የቃል ደረጃ silly ነው። ከ‹ማረሚያ› በታች ባሉ ደረጃዎች debug

MOBILETTO_LOG_LEVEL=silly # maximum logs!

የምዝግብ ማስታወሻ ፋይል

በነባሪ, ሎገር ወደ ኮንሶል ይጽፋል. ምዝግብ ማስታወሻዎችን ወደ ፋይል ለመላክ MOBILETTO_LOG_FILE የአካባቢ ተለዋዋጭ. ወደ ፋይል ሲገቡ፣ ምዝግብ ማስታወሻዎች ወደ ኮንሶሉ አይጻፉም።

MOBILETTO_LOG_FILE=/var/my_mobiletto_log

መዝገቡን ለማጥፋት፡-

MOBILETTO_LOG_FILE=/dev/null