所以我在 node.js 中构建了一个脚本,它应该接收 csv 文件,解析它们并将它们输入到数据库中。有时,当我调试我的代码时,它会像在 async_hooks.js 文件中找到的不可见断点一样停止,位于“emitHookFactory”函数的第一行(第 163 行)。
调用堆栈仅说明同一文件上的一个调用 - “emitBeforeNative”。
我在试验中注意到了一些事情:
我有 3 种类型的文件需要解析并放入数据库。它仅发生在一种文件类型上,该文件类型非常大(csv 上为 3.1m~ 行,而其他文件类型为 50~200K 行)。我试图部分加载它 - 只有开始的 20K 行(将它们复制到一个新文件,代码没有更改)并且它没有中断。这意味着大小与调试器停止有关?
我试图用其他方式重现它,但没有成功。此外,它并不总是发生(即使在同一个文件上运行) - 但像 80-85% 的时间。
我的脚本是这样的:查询 DB 和 AWS 以查找新文件 > 将文件下载到本地 > 从本地流式传输文件 > 在line事件解析行上执行数据操作 > 在end事件上 - 遍历所有操作的数据,构建查询和查询插入它的数据库。我在关键位置放置了几个断点,并发现断点 SEEMS 发生在发出line事件中间的某个地方。回调函数是一个普通的函数,不是async,里面也没有async操作。事实上,里面只有数组和字符串操作操作——甚至没有第三方操作或任何不寻常的操作。
我试图在互联网上寻找解决方案。没有找到任何明确的方法来完全摆脱它,只有我不太理解的解决方法(对 JS 环境有点陌生,所以我无法理解如何禁用或忽略它的概念......)
感谢您在高级方面的帮助。
我正在构建一个 Spring 后端。我有一个控制器,它获取一个“搜索对象”——一个包含 10 个字段的对象,只应填充其中一个字段,因此编写了搜索函数(我没有编写但需要对其进行更改和重构)像这样:
if( param1 != null ) user = getUserByParam1(param1);
else if ( param2 != null ) user = getUserByParam2(param2);
.
.
.
else if(lastName != null || lastName != null) user = getUserByName(firstName, lastName);
else user = getUserById(id);
if(user == null) throw costumException;
return user;
Run Code Online (Sandbox Code Playgroud)
注意最后的 2 个特殊情况——其中一个检查 2 个参数的可用性,而不是一个,并将它们都发送到同一个函数(它可以处理一个字段中的 null,但不能同时处理两个字段),以及默认情况正在传递一个 ID(如果它不是 - 它if (user == null)在抛出异常之后由检查处理)。
有没有办法重构这段代码以使其更具可读性/好看?我可以使用任何设计模式或已知方法来做到这一点吗?或者它实际上是编写这种功能的最佳方式?
我想了很多,但找不到更好的方法。我有一个想法,以某种方式将填充的字段名称及其值发送到另一个函数,该函数将在字段名称上“切换大小写”并将值发送到适当的函数,但它并没有真正节省多少代码(因为我仍然需要手动迭代所有字段以找到已填充的字段)而且我不确定它是否更具可读性。
我对 Java 也很陌生,所以我不知道所有可用的 API 和接口,也许您可以向我寻求帮助。