javascript - Node 坚持重型 Node.js 应用程序不返回值

标签 javascript node.js async-await node-persist

我有一个重 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;
            }
        }
    }
}

这段代码在一个长函数中有点深。一切都很简单。但是有两个问题:

  1. uid 通常是 undefined。我的猜测是该文件尚未保存,因此当我尝试对其进行 getItem 时,它具有未定义的值。
  2. 即使使用 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/

相关文章:

node.js - 在从 Node 模块导出的函数上使用 `jest.spyOn`

c# - 异步一直向下问题

c# - 异步和等待 - 如何维护执行顺序?

设置原型(prototype)时Javascript继承: calling Object.创建

javascript - Event.target.value 未正确检索值

javascript - 识别两个子串是否相邻的有效方法

node.js - IIS、Node.js 和带有 IISNode 的 Web 应用程序未使用虚拟目录正确配置

javascript - 使用 ES 模块运行 pm2

javascript - socket.io 基本发出和监听器失败

javascript - 异步/等待分配给对象键 : is it concurrent?