Mobiletto ເປັນຊັ້ນ abstraction ການເກັບຮັກສາ JavaScript, ມີທາງເລືອກໃນການເຂົ້າລະຫັດດ້ານລູກຄ້າໂປ່ງໃສ.
- ເປັນຫຍັງ Mobiletto?
- ເລີ່ມຕົ້ນດ່ວນ
- Mobiletto CLI
- ແຫຼ່ງຂໍ້ມູນ
- [ການຕິດຕັ້ງ](# ການຕິດຕັ້ງ)
- ການສະຫນັບສະຫນູນແລະການສະຫນອງທຶນ
- [ການນໍາໃຊ້ພື້ນຖານ](# ການນໍາໃຊ້ພື້ນຖານ)
- Metadata
- ຮູບແບບການນຳເຂົ້າສຳຮອງ
- Caching
- ການສະທ້ອນ
- ການເຂົ້າລະຫັດໂປ່ງໃສ
- ການຫມຸນກະແຈ
- ການໂຕ້ຕອບຄົນຂັບ
- ບັນທຶກ
ເອກະສານ README.md ນີ້ໄດ້ຖືກແປ, ຜ່ານ hokeylization, ເຂົ້າໄປໃນ ທຸກພາສາທີ່ຮອງຮັບໂດຍ Google Translate!
ຂ້ອຍແນ່ໃຈວ່າມັນບໍ່ສົມບູນແບບ, ແຕ່ຂ້ອຍຫວັງວ່າມັນຈະດີກ່ວາບໍ່ມີຫຍັງ!
🇸🇦 ອາຣັບ 🇧🇩 Bengali 🇩🇪 ເຢຍລະມັນ 🇺🇸ພາສາອັງກິດ 🇪🇸 ແອສປາໂຍນ 🇫🇷 ຝຣັ່ງ 🇹🇩 Hausa 🇮🇳 ຮິນດູ 🇮🇩 ອິນໂດເນເຊຍ 🇮🇹 Italian 🇯🇵 ພາສາຍີ່ປຸ່ນ 🇰🇷ເກົາຫຼີ 🇮🇳 Marathi 🇵🇱 ໂປໂລຍ 🇧🇷 ປອກຕຸຍການ 🇷🇺ລັດເຊຍ 🇰🇪 Swahili 🇵🇭 Tagalog 🇹🇷 ຕວກກີ 🇵🇰 Urdu 🇻🇳 ຫວຽດນາມ 🇨🇳 ຈີນ
ການແປສະເພາະນີ້ຂອງຕົ້ນສະບັບ README ອາດຈະມີຂໍ້ບົກພ່ອງ -- ການແກ້ໄຂແມ່ນຍິນດີຕ້ອນຮັບຫຼາຍ! ກະລຸນາສົ່ງ ການຮ້ອງຂໍດຶງກ່ຽວກັບ GitHub, ຫຼືຖ້າທ່ານບໍ່ສະດວກໃນການເຮັດແນວນັ້ນ, ເປີດບັນຫາ
ເມື່ອທ່ານສ້າງບັນຫາ GitHub ໃໝ່ກ່ຽວກັບການແປ, ກະລຸນາເຮັດ:
- ລວມເອົາ URL ຂອງໜ້າ (ສຳເນົາ/ວາງຈາກແຖບທີ່ຢູ່ຂອງບຣາວເຊີ)
- ລວມເອົາຂໍ້ຄວາມທີ່ແນ່ນອນວ່າຜິດພາດ (ຄັດລອກ / ວາງຈາກຕົວທ່ອງເວັບ)
- ກະລຸນາອະທິບາຍສິ່ງທີ່ຜິດພາດ -- ການແປບໍ່ຖືກຕ້ອງບໍ? ການຈັດຮູບແບບຖືກທໍາລາຍຢ່າງໃດ?
- ຂໍສະເໜີຄຳແນະນຳການແປທີ່ດີກວ່າ, ຫຼືວ່າຂໍ້ຄວາມຄວນຖືກຈັດຮູບແບບແນວໃດໃຫ້ຖືກຕ້ອງ
- ຂອບໃຈ!
###ສະບາຍດີ ຜູ້ຂາຍ ລັອກອິນ! ຜູ້ໃຫ້ບໍລິການເກັບຮັກສາຟັງຄລາວຕ່າງໆມີ APIs ທີ່ບໍ່ເຂົ້າກັນໄດ້. ເຖິງແມ່ນວ່າຜູ້ທີ່ພະຍາຍາມ "ເຂົ້າກັນໄດ້ S3" ມີພຶດຕິກໍາ idiosyncratic.
ເມື່ອທ່ານເລືອກຜູ້ຂາຍບ່ອນເກັບຂໍ້ມູນສະເພາະສໍາລັບແອັບຯຂອງທ່ານ, ຖ້າທ່ານລະຫັດໂດຍກົງໃສ່ API ຂອງພວກເຂົາ, ແອັບຯຂອງທ່ານ ໃນປັດຈຸບັນແມ່ນຂຶ້ນກັບການບໍລິການນັ້ນ. ເມື່ອເວລາຜ່ານໄປແລະລະຫັດສະສົມ, ຜູ້ຂາຍປ່ຽນກາຍເປັນ untenable ຫຼາຍຂຶ້ນ. ຍິນດີຕ້ອນຮັບສູ່ໂລກທີ່ມ່ວນຊື່ນຂອງຜູ້ຂາຍລັອກອິນ!
Mobiletto ໄດ້ຖືກອອກແບບເພື່ອແກ້ໄຂບັນຫານີ້. ໂດຍການໃສ່ລະຫັດແອັບຯຂອງທ່ານໃສ່ API ຂອງ mobiletto, ທ່ານສາມາດໄດ້ຢ່າງງ່າຍດາຍ ປ່ຽນຜູ້ໃຫ້ບໍລິການບ່ອນເກັບຂໍ້ມູນ ແລະຮູ້ວ່າຊັ້ນເກັບຂໍ້ມູນຂອງແອັບຯຂອງເຈົ້າຈະມີລັກສະນະຄືກັນ.
ຄົນຂັບທັງໝົດຖືກທົດສອບສຳລັບພຶດຕິກຳທີ່ຄືກັນດ້ວຍການທົດສອບ 60+ ສຳລັບຄົນຂັບແຕ່ລະຄົນ. ພວກເຮົາທົດສອບຄົນຂັບທັງຫມົດທີ່ມີການປະສົມປະສານຂອງ:
- ການເຂົ້າລະຫັດ: ທັງເປີດ ແລະປິດໃຊ້ງານ
- ແຄດ Redis: ທັງເປີດ ແລະປິດໃຊ້ງານ
ວິທີການນີ້ເຮັດໃຫ້ພວກເຮົາສະຫງົບໃຈວ່າ mobiletto ຈະປະຕິບັດຕົວດຽວກັນບໍ່ວ່າທ່ານຈະໃຊ້ຄົນຂັບໃດກໍ່ຕາມ, ແລະບໍ່ຄໍານຶງເຖິງວ່າທ່ານຈະເປີດໃຊ້ caching ແລະ/ຫຼື encryption.
ໄດເວີການເກັບຮັກສາ Mobiletto ໃນປັດຈຸບັນ:
s3: Amazon S3b2: Backblaze B2localທ້ອງຖິ່ນ`: ລະບົບໄຟລ໌ທ້ອງຖິ່ນ
ການປະກອບສ່ວນເພື່ອສະໜັບສະໜູນຜູ້ໃຫ້ບໍລິການຈັດເກັບຂໍ້ມູນຄລາວຫຼາຍຂຶ້ນແມ່ນຍິນດີຕ້ອນຮັບຫຼາຍ!
Mobiletto ມີຈຸດປະສົງເພື່ອໃຊ້ເປັນຫ້ອງສະຫມຸດໂດຍລະຫັດ JavaScript ອື່ນໆ.
ເພື່ອເຮັດວຽກກັບ mobiletto ຢູ່ແຖວຄໍາສັ່ງ, ໃຫ້ໃຊ້ mobiletto-cli
ຂ້ອຍພະຍາຍາມເປັນຜູ້ພັດທະນາຊອບແວ open source ມືອາຊີບ. ຂ້ອຍໄດ້ເຮັດວຽກຢູ່ໃນ ອຸດສາຫະກໍາຊອບແວສໍາລັບເວລາຫຼາຍປີ, ຂ້າພະເຈົ້າໄດ້ເລີ່ມຕົ້ນບໍລິສັດສົບຜົນສໍາເລັດແລະຂາຍໃຫ້ເຂົາເຈົ້າກັບບໍລິສັດສາທາລະນະ. ຫວ່າງມໍ່ໆມານີ້, ຂ້າພະເຈົ້າໄດ້ສູນເສຍວຽກເຮັດງານທຳ, ແລະຂ້າພະເຈົ້າກໍບໍ່ມີວຽກງານອື່ນຕິດຕາມ
ດັ່ງນັ້ນຂ້ອຍຈະພະຍາຍາມຂຽນຊອບແວທີ່ເປັນປະໂຫຍດແລະເບິ່ງວ່າມັນເຮັດວຽກຫຼືບໍ່
ຖ້າຫາກວ່າທ່ານມີຄວາມສຸກການນໍາໃຊ້ຊອບແວນີ້, ຂ້າພະເຈົ້າຈະຂໍຂອບໃຈຫຼາຍສໍາລັບການເຖິງແມ່ນວ່າ ນ້ອຍສຸດ ການປະກອບສ່ວນລາຍເດືອນຜ່ານ Patreon
ຂອບໃຈ!
ຕິດຕັ້ງໂດຍໃຊ້ npm ຫຼື yarn . ທ່ານອາດຈະຕ້ອງການສະບັບ lite ທີ່ບໍ່ປະກອບມີທັງຫມົດ
ແປໄຟລ໌ README:
npm install mobiletto-lite
yarn add mobiletto-lite
ຖ້າທ່ານຕ້ອງການໄຟລ໌ README ໃນທຸກໆພາສາ, ຕິດຕັ້ງສະບັບເຕັມ:
npm install mobiletto
yarn add mobiletto
ຕົວຢ່າງສັ້ນໆທີ່ໃຊ້ໄດເວີ 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 ຕອບ metadata ກ່ຽວກັບການປ້ອນລະບົບໄຟລ໌ດຽວ.
ເຊັ່ນດຽວກັນ, ມູນຄ່າກັບຄືນຈາກຄໍາສັ່ງ list ແມ່ນ array ຂອງວັດຖຸ metadata.
ວັດຖຸ metadata ເບິ່ງຄືວ່ານີ້:
{
"name": "fully/qualified/path/to/file",
"type": "entry-type",
"size": size-in-bytes,
"ctime": creation-time-epoch-millis,
"mtime": modification-time-epoch-millis
}
ຄຸນສົມບັດ ປະເພດ typeສາມາດເປັນfile,dir,link, ຫຼື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')
Mobiletto ເຮັດວຽກທີ່ດີທີ່ສຸດກັບ redis cache.
Mobiletto ຈະພະຍາຍາມເຊື່ອມຕໍ່ກັບຕົວຢ່າງ redis ໃນ 127.0.0.1:6379
ທ່ານສາມາດ override ທັງສອງອັນນີ້:
- ຕັ້ງ
MOBILETTO_REDIS_HOSTenv var, mobiletto ເຊື່ອມຕໍ່ທີ່ນີ້ແທນ localhost - ຕັ້ງ
MOBILETTO_REDIS_PORTenv var, ພອດນີ້ຈະຖືກໃຊ້
Mobiletto ຈະເກັບຮັກສາກະແຈ redis ທັງໝົດຂອງມັນດ້ວຍຄຳນຳໜ້າ _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)
ເພື່ອປິດການໃຊ້ງານ: pass enabled: false ໃນວັດຖຸ opts.redisConfig ຂອງທ່ານເມື່ອທ່ານສ້າງການເຊື່ອມຕໍ່ຂອງທ່ານ.
ດັ່ງທີ່ໄດ້ກ່າວໄວ້ຂ້າງລຸ່ມນີ້, ການປິດການໃຊ້ງານຖານຄວາມຈໍາຈະມີຜົນກະທົບທາງລົບຕໍ່ການປະຕິບັດແລະເຮັດໃຫ້ເກີດການຮ້ອງຂໍເພີ່ມເຕີມ ເພື່ອເກັບຮັກສາທີ່ເຈົ້າຕ້ອງການແທ້ໆ.
** ການເກັບຮັກສາເຂົ້າລະຫັດ **: ການອ່ານ / ການຂຽນການເກັບຮັກສາເຂົ້າລະຫັດແມ່ນພຽງແຕ່ຊ້າກ່ວາປົກກະຕິເລັກນ້ອຍ, ແຕ່ການທ່ອງໄປຫາໄດເລກະທໍລີ (ທີ່ບາງສິ່ງທີ່ເຮັດ) ແມ່ນລາຄາແພງພໍສົມຄວນ. ການນໍາໃຊ້ຖານຄວາມຈໍາ redis ຈະໃຫ້ທ່ານມີການເພີ່ມປະສິດທິພາບທີ່ສໍາຄັນ.
cache ເລີ່ມຕົ້ນແມ່ນປອດໄພ, ແຕ່ບໍ່ດີຖ້າທ່ານມີການດໍາເນີນງານການຂຽນ / ລົບຫຼາຍ. ການດໍາເນີນງານການຂຽນຫຼືລົບໃດໆ invalidates cache ທັງຫມົດ, ການຮັບປະກັນການອ່ານຕໍ່ໄປຈະເຫັນໄດ້ ການປ່ຽນແປງຫຼ້າສຸດ.
ຖ້າທ່ານກໍາລັງໃຊ້ເຄື່ອງມື CLI ເຊັ່ນ mobiletto-cli,
ທ່ານແນ່ນອນຕ້ອງການ redis cache ເປີດໃຊ້, ຍ້ອນວ່າມັນຈະແກ່ຍາວເຖິງການຮຽກຮ້ອງຂອງຄໍາສັ່ງ 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 ປະຕິບັດການສໍາເນົາຫນຶ່ງຄັ້ງຂອງໄຟລ໌ທັງຫມົດຈາກ mobiletto ຫນຶ່ງໄປຫາອື່ນ.
ມັນບໍ່ໄດ້ດໍາເນີນຂະບວນການໃດໆເພື່ອຮັກສາກະຈົກໃນໄລຍະເວລາ. ດໍາເນີນການຄໍາສັ່ງ mirror ອີກເທື່ອຫນຶ່ງ
ເພື່ອ synchronize ໄຟລ໌ໃດທີ່ຂາດຫາຍໄປ.
ຄ່າກັບຄືນຈາກ mirror ແມ່ນວັດຖຸທີ່ງ່າຍດາຍທີ່ມີຕົວນັບສໍາລັບຈໍານວນໄຟລ໌ທີ່ປະສົບຜົນສໍາເລັດ
mirrored ແລະຈໍານວນໄຟລ໌ທີ່ມີຂໍ້ຜິດພາດ:
{
success: count-of-files-mirrored,
errors: count-of-files-with-errors
}
ຄໍາເຕືອນ: ການສະທ້ອນຊຸດຂໍ້ມູນຂະຫນາດໃຫຍ່ສາມາດໃຊ້ເວລາຫຼາຍແລະໃຊ້ແບນວິດຫຼາຍ.
ດ້ວຍຄຳວ່າ mirror call semantics ມັນບາງຄັ້ງອາດສັບສົນທີ່ຈະເຂົ້າໃຈວ່າໃຜແມ່ນໃຜ
ຜູ້ອ່ານແລະໃຜເປັນນັກຂຽນ. ຈິນຕະນາການມັນຄືກັບຄໍາຖະແຫຼງການມອບຫມາຍ: "ມືຖືຊ້າຍມື"
ແມ່ນສິ່ງທີ່ໄດ້ຮັບການມອບຫມາຍໃຫ້ (ຂໍ້ມູນ mirrored ລາຍລັກອັກສອນ), ແລະ "ຂວາມື mobiletto" (ໄດ້
argument ກັບວິທີການ 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
ເກີດຫຍັງຂຶ້ນ? ໄດເຣັກທໍຣີ "ການເຂົ້າລະບົບ" ແຍກຕ່າງຫາກ (dirent) ໄດເລກະທໍລີ (ເຂົ້າລະຫັດ) ຕິດຕາມວ່າໄຟລ໌ໃດຢູ່ໃນນັ້ນ directory (aka the dirent directory).
- ຄໍາສັ່ງ
listອ່ານໄຟລ໌ລາຍຊື່ໄດເລກະທໍລີ, ຖອດລະຫັດແຕ່ລະເສັ້ນທາງທີ່ລະບຸໄວ້; ຈາກນັ້ນສົ່ງຄືນ metadata ສໍາລັບແຕ່ລະໄຟລ໌ - ຄໍາສັ່ງ
listແມ່ນບໍ່ມີປະສິດທິພາບຫຼາຍ, ໂດຍສະເພາະສໍາລັບໄດເລກະທໍລີທີ່ມີໄຟລ໌ຈໍານວນຫລາຍ - ຄໍາສັ່ງ
writeຂຽນໄຟລ໌ dirent ໃນໄດເລກະທໍລີ dirent ຂອງພໍ່ແມ່ແຕ່ລະຄົນ, recursively; ຫຼັງຈາກນັ້ນຂຽນໄຟລ໌ - ຄໍາສັ່ງ
writeຈະເກີດ O(N) writes, ມີ N = ຄວາມເລິກໃນລໍາດັບລະບົບ - ຄໍາສັ່ງ
removeເອົາໄຟລ໌ dirent ທີ່ສອດຄ້ອງກັນ, ແລະພໍ່ແມ່ຂອງມັນຖ້າຫວ່າງເປົ່າ, recursively; ຈາກນັ້ນລຶບໄຟລ໌ອອກ - ຄໍາສັ່ງ
removeທີ່ບໍ່ແມ່ນ recursive ຈະເຮັດໃຫ້ເກີດ O(N) ອ່ານແລະອາດຈະເປັນການລຶບຈໍານວນຫຼາຍ, ດ້ວຍ N = ຄວາມເລິກໃນລໍາດັບຊັ້ນຂອງໄດເລກະທໍລີ. - ຄໍາສັ່ງ
removeຢູ່ໃນລະບົບໄຟລ໌ຂະຫນາດໃຫຍ່ແລະເລິກສາມາດມີລາຄາແພງ
ໃຫ້ສັງເກດວ່າເຖິງແມ່ນວ່າການເຂົ້າລະຫັດຂ້າງລູກຄ້າໄດ້ຖືກເປີດໃຊ້, ສັດຕູທີ່ມີການເບິ່ງເຫັນຢ່າງເຕັມທີ່ເຂົ້າໄປໃນຝ່າຍເຊີຟເວີທີ່ຖືກເຂົ້າລະຫັດຂອງທ່ານ. ການເກັບຮັກສາ, ເຖິງແມ່ນວ່າບໍ່ມີກະແຈ, ຍັງສາມາດເຫັນຈໍານວນທັງຫມົດຂອງໄດເລກະທໍລີແລະຈໍານວນໄຟລ໌ຢູ່ໃນແຕ່ລະ, ແລະດ້ວຍ ຄວາມພະຍາຍາມບາງຢ່າງ, ຄົ້ນພົບບາງຫຼືທັງຫມົດຂອງໂຄງປະກອບການໂດຍລວມຂອງລໍາດັບລະບົບ. ໝາຍເຫດ: ໃຊ້ໂຄງສ້າງທີ່ຂ້ອນຂ້າງຮາບພຽງເພື່ອຄວາມປອດໄພທີ່ດີກວ່າ. ສັດຕູຈະບໍ່ຮູ້ຈັກຊື່ຂອງໄດເລກະທໍລີ / ໄຟລ໌ເວັ້ນເສຍແຕ່ວ່າພວກເຂົາຮູ້ຈັກການເຂົ້າລະຫັດຂອງທ່ານ ຄີ ຫຼືມີການແຕກແຍກການເຂົ້າລະຫັດຢ່າງສຳເລັດຜົນ. ການເດີມພັນທັງໝົດແມ່ນປິດແລ້ວ!
ການດໍາເນີນງານກ່ຽວກັບການເກັບຮັກສາທີ່ເຂົ້າລະຫັດອາດຈະຊ້າ. ລາຍຊື່ແລະການຖອນຄືນຄືນສາມາດຊ້າຫຼາຍ. Caching ຜ່ານ redis ຊ່ວຍຢ່າງຫຼວງຫຼາຍ, ແຕ່ສັງເກດວ່າ cache ຈະຖືກ flushed ເມື່ອຂຽນຫຼືເອົາອອກ.
ສ້າງ mobiletto ດ້ວຍກະແຈໃໝ່ຂອງເຈົ້າ, ຈາກນັ້ນສະທ້ອນຂໍ້ມູນເກົ່າເຂົ້າໄປໃນມັນ:
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...
ໄດເວີແມ່ນໄຟລ໌ JS ທີ່ສົ່ງອອກຟັງຊັນ 'storageClient' ທີ່ມີລາຍເຊັນນີ້:
function storageClient (key, secret, opts)
key: a string, API key (ສຳລັບlocaldriver ນີ້ແມ່ນ base directory)secretຄວາມລັບ: ສະຕິງ, ຄວາມລັບ API ຂອງທ່ານ (ສາມາດຖືກລະເວັ້ນສຳລັບຄົນຂັບlocal` )opts: ວັດຖຸ, ຄຸນສົມບັດແມ່ນຕໍ່ຄົນຂັບ:- ສໍາລັບ
local, ຄຸນສົມບັດfileModeແລະdirModeກໍານົດວິທີການສ້າງໄຟລ໌ແລະໄດເລກະທໍລີໃຫມ່ - ສໍາລັບ
s3, ຄຸນສົມບັດbucketແມ່ນຕ້ອງການ. ຄຸນສົມບັດທາງເລືອກແມ່ນ:region: the S3 region, default is us-east-1prefix: a prefix to prepend to all S3 paths, default is the empty stringdelimiter: the directory delimiter, default is '/'
ວັດຖຸທີ່ຟັງຊັນ storageClient ກັບຄືນມາຕ້ອງກໍານົດຟັງຊັນເຫຼົ່ານີ້:
// 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 ໃຊ້ຫ້ອງສະໝຸດບັນທຶກ winston.
ບັນທຶກ ຈະ ມີເສັ້ນທາງໄຟລ໌ ແລະຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດ, ແຕ່ຈະ ບໍ່ເຄີຍ ມີກະແຈ, ຄວາມລັບ, ຫຼືຂໍ້ມູນການຕັ້ງຄ່າການເຊື່ອມຕໍ່ອື່ນໆ.
ໃຊ້ຕົວແປສະພາບແວດລ້ອມ MOBILETTO_LOG_LEVEL ເພື່ອກໍານົດລະດັບບັນທຶກ, ໂດຍໃຊ້ອັນດຽວ
ຂອງລະດັບ npm ທີ່ກຳນົດໄວ້ໃນ https://www.npmjs.com/package/winston#logging-levels
ລະດັບເລີ່ມຕົ້ນແມ່ນ error . ລະດັບ verbose ທີ່ສຸດແມ່ນ silly , ເຖິງແມ່ນວ່າໃນປັດຈຸບັນ mobiletto
ບໍ່ໄດ້ບັນທຶກໃນລະດັບຂ້າງລຸ່ມນີ້ debug
MOBILETTO_LOG_LEVEL=silly # maximum logs!
ໂດຍຄ່າເລີ່ມຕົ້ນ, ຜູ້ຕັດໄມ້ຂຽນໃສ່ console. ເພື່ອສົ່ງບັນທຶກໄປຫາໄຟລ໌, ຕັ້ງຄ່າ MOBILETTO_LOG_FILE
ສະພາບແວດລ້ອມປ່ຽນແປງ. ເມື່ອບັນທຶກໄຟລ໌, ບັນທຶກຈະບໍ່ຖືກຂຽນໃສ່ console ອີກຕໍ່ໄປ.
MOBILETTO_LOG_FILE=/var/my_mobiletto_log
ເພື່ອປິດການບັນທຶກ:
MOBILETTO_LOG_FILE=/dev/null