我有一个重型节点应用程序,我正在使用 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
。我的猜测是该文件尚未保存,因此当我尝试获取该文件时,它具有未定义的值。 即便如此if (uid == 'undefined')
,console.log(uid)
还是丢了不少undefined
。我不明白为什么,因为我正在“返回”。
代码真的就是这样。这if
可能被称为每秒 15-20 次。没有其他代码可能会在控制台上抛出“未定义”,也没有任何写入数据库的代码。
为什么会这样?我该怎么做才能正确处理它?
编辑 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
尚未完成写入的文件。