Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
node-persist
Advanced tools
Super-easy (and fast) persistent data structures in Node.js, modeled after HTML5 localStorage
Node-persist doesn't use a database. Instead, JSON documents are stored in the file system for persistence. Because there is no network overhead, node-persist is just about as fast as a database can get. Node-persist uses the HTML5 localStorage API, so it's easy to learn.
This is still a work in progress. Send pull requests please.
getItem
/setItem
does not.synchronous
and asynchronous
use node-persist@2.1.0
$ npm install node-persist
const storage = require('node-persist');
//you must first call storage.init or initSync
storage.initSync( /* options ... */ );
// or
// storage.init( /* options ... */ );
// then anywhere else in your code
await storage.setItem('name','yourname')
console.log(await storage.getItem('name')); // yourname
$ cd examples/counter
$ node counter.js
$ open up localhost:8080
backward changes
writeQueue*
options, trying to resolve issue#108, see the API Documentation below.Non-backward changes
*Sync
functions were removed, every operation is now asynchronouspersist*
functions were removedasync/await
continuous
and interval
options were removed, since we immediately persist to disk now, asynchronouslyforEach
callback now accepts an object callback({key, value})
instead of 2 arguments callback(key, value)
Non-backward changes
options.ttlDir
, since the ttls
are now stored in the same file as each valueexpiredInterval
optionforgiveParseErrors
optionMostly non-backward changes
storage.getItem()
now returns a promisestorage.valuesWithKeyMatch()
no longer accepts a callbackstorage.values()
no longer accepts a callbackstorage.key()
is gonedir
is now process.cwd() + (dir || '.node-persist/storage')
, unless you use an absolute pathstorage.get()
, alias to getItem()
storage.set()
, alias to setItem()
storage.del()
, storage.rm()
, as aliases to removeItem()
/
async init(options, [callback])
if the storage dir is new, it will create it
You can pass init()
an options object to customize the behavior of node-persist
These are the defaults
await storage.init({
dir: 'relative/path/to/persist',
stringify: JSON.stringify,
parse: JSON.parse,
encoding: 'utf8',
// can also be custom logging function
logging: false,
// ttl* [NEW], can be true for 24h default or a number in MILLISECONDS or a valid Javascript Date object
ttl: false,
// every 2 minutes the process will clean-up the expired cache
expiredInterval: 2 * 60 * 1000,
// in some cases, you (or some other service) might add non-valid storage files to your
// storage dir, i.e. Google Drive, make this true if you'd like to ignore these files and not throw an error
forgiveParseErrors: false,
// instead of writing to file immediately, each "file" will have its own mini queue to avoid corrupted files, keep in mind that this would not properly work in multi-process setting.
writeQueue: true,
// how often to check for pending writes, don't worry if you feel like 1s is a lot, it actually tries to process every time you setItem as well
writeQueueIntervalMs: 1000,
// if you setItem() multiple times to the same key, only the last one would be set, BUT the others would still resolve with the results of the last one, if you turn this to false, each one will execute, but might slow down the writing process.
writeQueueWriteOnlyLast: true,
});
async getItem(key)
This function will get the value for that key stored on disk
let value = await storage.getItem('obj');
async setItem(key, value, [options])
This function sets 'key' in your database to 'value'
await storage.setItem('fibonacci',[0,1,1,2,3,5,8]);
await storage.setItem(42,'the answer to life, the universe, and everything.');
await storage.setItem(42,'the answer to life, the universe, and everything.', {ttl: 1000*60 /* 1 min */ });
* The only option available when calling setItem(key, value, option)
is {ttl: Number|Date}
async updateItem(key, value, [options])
This function updates a 'key' in your database with a new 'value' without touching the ttl
, however, if the key
was not found or if it was expired
a new item will get set
await storage.updateItem(42,'the answer to life, the universe, and everything.', {ttl: 1000*60*10 /* 10 minutes */ });
await storage.updateItem(42,'means nothing, do not trust wikipedia'); // ttl is still the same, will expired in 10 minutes since it was first set
* The only option available when calling updateItem(key, value, option)
is {ttl: Number|Date}
async removeItem(key)
This function immediately deletes it from the file system asynchronously
await storage.removeItem('me');
async clear()
This function immediately deletes all files from the file system asynchronously.
await storage.clear();
async values()
This function returns all of the values
await storage.setItem("batman", {name: "Bruce Wayne"});
await storage.setItem("superman", {name: "Clark Kent"});
console.log(await storage.values()); //output: [{name: "Bruce Wayne"},{name: "Clark Kent"}]
async valuesWithKeyMatch(match)
This function returns all of the values matching a string or RegExp
await storage.setItem("batman", {name: "Bruce Wayne"});
await storage.setItem("superman", {name: "Clark Kent"});
await storage.setItem("hulk", {name: "Bruce Banner"});
console.log(await storage.valuesWithKeyMatch('man')); //output: [{name: "Bruce Wayne"},{name: "Clark Kent"}]
// also accepts a Regular Expression
console.log(await storage.valuesWithKeyMatch(/man/)); //output: [{name: "Bruce Wayne"},{name: "Clark Kent"}]
async keys()
this function returns an array of all the keys in the database.
console.log(await storage.keys()); // ['batman', 'superman']
async length()
This function returns the number of keys stored in the database.
console.log(await storage.length()); // 2
async forEach(callback)
This function iterates over each key/value pair and executes an asynchronous callback as well
storage.forEach(async function(datum) {
// use datum.key and datum.value
});
create(options)
- synchronous, static methodIf you choose to create multiple instances of storage, you can. Just avoid using the same dir
for the storage location.
You still have to call init
after create
- you can pass your configs to either create
or init
const storage = require('node-persist');
const myStorage = storage.create({dir: 'myDir', ttl: 3000});
await myStorage.init();
npm install
npm test
FAQs
Super-easy (and fast) persistent data structures in Node.js, modeled after HTML5 localStorage
We found that node-persist demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.