У меня есть приложение с тяжелым узлом, и я использую node-persist для сохранения данных в локальную базу данных.
На определенном этапе у меня есть это:
const localdb = require('node-persist')
const storage = localdb.create({ttl: true})
await storage.init()
function game(socket, log, opts) {
// [...]
async function scoreHandler(data) {
if (data.scoreUp) {
await storage.setItem(data.sid,data.uid)
} else if (data.scoreDown) {
try {
let uid = await storage.getItem(data.sid);
if (typeof uid == 'undefined') {
return;
}
console.log(uid);
} catch (e) {
return;
}
}
}
}
Этот коднемного глубоко в длинной функции.Все очень просто.Но есть две проблемы:
- Чаще, чем
uid
равен undefined
.Я предполагаю, что файл еще не был сохранен, поэтому, когда я пытаюсь получить для негоIItem, он имеет неопределенное значение. - Даже при этом
if (uid == 'undefined')
, console.log(uid)
по-прежнему выдает много undefined
,Я не могу понять, почему, так как я "возвращаюсь".
Код на самом деле просто так.Это if
, вероятно, вызывается 15-20 раз в секунду.Нет другого фрагмента кода, который может выдавать «undefined» на консоли, или чего-либо, записывающего в базу данных.
Почему это происходит?И что я могу сделать, чтобы правильно с этим справиться?
Edit 1
Точка 2 я разобрался.Я забыл поставить typeof
.
Редактировать 2
Я добавил init
в соответствии с просьбой.
Если я удаляю try...catch
, Я получаю эту ошибку довольно часто:
(node:9608) UnhandledPromiseRejectionWarning: Error: [node-persist][readFile] ... does not look like a valid storage file!
at fs.readFile (...node-persist/src/local-storage.js:277:66)
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)
Итак, я предполагаю, что getItem
пытается прочитать файл, который setItem
еще не закончил писать.