J'essaye de sauvegarder une variable contenant un tableau d'objets d'une classe dans NodeJS dans un fichier afin que je puisse la réutiliser à partir de là au lieu d'avoir à la réobtenir comme si
const chatAPI = require("some_module");
const client = new chatAPI.Client("Auth-Key");
var channels = client.channels();
//Now channels is something I would like to use later on
//Say
channels.forEach(channel => {channel.send("Hello")});
Y a-t-il un moyen de sauvegarder la variable des canaux dans un fichier afin de pouvoir le charger à nouveau dans la mémoire du programme lors d'une exécution ultérieure et de l'utiliser comme je l'ai fait sans avoir à créer un nouveau client et à récupérer les données.
Pour élaborer, ce serait la même chose que si je laissais ce programme s'exécuter pendant un certain temps avec une boucle de blocage, et que j'utilisais plus tard la variable, dans ce cas, je n'aurais pas à analyser ou reconstruire les données de toute façon .
3 Réponses :
Il y a plusieurs façons de faire cela, par exemple
let globalObject = null;
someMethod.get((obj) => {
// Save this for later use
globalObject = obj;
})
// Later on
if (globalObject) {
globalObject.doStuff();
}
Vous pouvez également:
let b = JSON.parse(fs.readFileSync("./saved_data.json"));
console.log("b", b);
Maintenant, vous ne pouvez enregistrer que le data pas les méthodes!
Si vous voulez conserver un objet , j'utiliserais une variable globale pour stocker ceci:
let a = {foo: "bar" };
console.log("a", a);
fs.writeFileSync("./saved_data.json", JSON.stringify(a));
let b = require("./saved_data.json");
console.log("b", b);
Je veux pouvoir stocker cette variable globale dans un fichier et ne pas laisser le programme en cours d'exécution
Vous pouvez donc le faire si la variable peut être convertie en JSON. Si l'objet contient des méthodes / fonctions, vous ne pouvez pas le faire facilement. C'est possible mais je ne pense pas que ce soit vraiment une bonne idée.
D'après mon expérience, pour un projet à petite échelle, la meilleure option est d'utiliser la base de données SQLite qui peut être utilisée sans aucun moteur de base de données et toute la base de données elle-même ne serait qu'un fichier facilement déplaçable. cela prend également en charge (généralement) les requêtes SQL standard pour insérer, mettre à jour, sélectionner. cela ne nécessite qu'un seul "require" dans node.js et les mêmes fonctions peuvent être utilisées sur php, android, et presque n'importe quelle autre plate-forme avec un minimum d'effort.
ceci est un exemple d'insertion et sélectionnez
//-- sqlite3 db --//
////////////////////
var sqlite3 = require('sqlite3').verbose()
function AddChatlogToDB(from,to,content){
// open the database
let db = new sqlite3.Database('./chatLog.db', sqlite3.OPEN_READWRITE, (err) => {
if (err) {
console.error(err.message);
return false;
}
/////INSERT INTO TABLE
db.run("INSERT INTO chatLogs (cl_time,cl_from,cl_to,cl_content) VALUES (?,?,?,?)",
[Date.now(),from,to,content]);
db.close((err) => {
if (err) {
console.error(err.message);
}
//console.log('Close the database connection.');
return true;
});
console.log("chatlog: ", from,to,content);
});
}
function getLast20ChatLogs(uid, callback){
let db = new sqlite3.Database('./chatLog.db', sqlite3.OPEN_READWRITE, (err) => {
if (err) {
console.error(err.message);
return;
}
let sql = 'Select * from chatLogs WHERE cl_to IS NULL ORDER BY cl_time DESC limit 20;'
db.all(sql, [], (err, rows) => {
if (err) {
throw err;
}
if(callback) callback(rows);
});
db.close((err) => {
if (err) {
console.error(err.message);
}
});
});
}
J'ai utilisé ces deux fonctions dans mes projets,
il stocke les données dans le dossier AppData par défaut du système d'exploitation:
set_option(
'data.json',
JSON.stringify(jsonObject)
)
get_option('data.json', function (err, data) {
if (!err && data) {
let jsonObject = JSON.parse(data)
// Do something ..
}
})
Ensuite, vous pouvez faire quelque chose comme: p >
const {
app
} = remote
const fs = require('fs')
function get_option(file, callback) {
fs.readFile(
app.getPath('userData') + '\\user_data' + '\\' + file, 'utf8',
function (err, data) {
callback(err, data)
}
)
}
function set_option(file, data) {
if (data) {
fs.writeFileSync(
app.getPath('userData') + '\\user_data' + '\\' + file, data
)
} else {
fs.unlink(
app.getPath('userData') + '\\user_data' + '\\' + file,
function (err) {}
)
}
}
Vous pouvez enregistrer des données dans un fichier car les données sont indépendantes, vous ne pouvez pas enregistrer les objets car l'objet a des méthodes et des références à la mémoire qui ne peuvent pas être enregistrées et perdues à la sortie du programme. Vous pouvez cependant supprimer les données de l'objet et les enregistrer, puis initialiser l'objet à partir de ces données si l'objet les prend en charge.
Quelle est la raison de ne pas vouloir laisser le programme en cours d'exécution?
Vous pouvez trouver la bibliothèque cryo à github.com/hunterloftis/cryo utile.