我有一个重 Node 应用程序,我正在使用 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
。我的猜测是该文件尚未保存,因此当我尝试对其进行 getItem 时,它具有未定义的值。即使使用if (uid == 'undefined')
,console.log(uid)
仍然会抛出许多undefined
.我不明白为什么,因为我正在“返回”。
代码就是这样。这个 if
大概每秒被调用 15-20 次。没有其他代码可能会在控制台上抛出“未定义”,也没有任何写入数据库的代码。
为什么会这样?我该怎么做才能正确处理它?</p>
编辑 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
尚未完成写入的文件。
最佳答案
node-persist
似乎不能可靠地处理并发读写。
如果在 setItem
进行期间调用了 getItem
,则会抛出此错误。
唯一的解决方案是,这由库修复,或者您确保永远不会在 setItem
时调用 getItem
。
我的建议是将与该存储相关的所有内容包装到一个自己的类中。这样您以后就可以轻松地用另一个库替换它。
我填写了一个问题:
Concurrent setItem
and getItem
can lead into an unahdled does not look like a valid storage file
关于javascript - Node 坚持重型 Node.js 应用程序不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52582180/