admin管理员组

文章数量:815012

Knex.js

我刚刚开始在使用Node.js的命令行脚本项目中使用Knex.js。

我已经运行了,并且可以运行查询等。但是当我的脚本完成(并且所有未完成的promise已解决)时,Node进程将永远挂起,直到用ctrl+c杀死它为止。

我是否需要做一些事情来告诉Knex与数据库断开连接-但仅在完成所有查询之后?

我尝试将其作为脚本的结尾:

knex.destroy();

...但是那只会立即终止连接,即,如果有一个尚未完成的查询承诺尚未完成,它将立即被终止,我得到:

UnhandledPromiseRejectionWarning: Error: aborted
...
(node:18284) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 

...我知道错误是什么,它在我的一个查询完成之前就终止了连接。我只是想不通如何解决无事可做的总体问题。

我已经使用Node和promises / async / await了几年了,但是我似乎经常遇到这些问题,直到最后冻结了进程,除非我专门编写代码来关闭数据库连接和类似的东西。这个...这通常为时过早。我已经阅读了很多有关异步/承诺的资源,但是在Node进程关闭/退出时,我从来没有找到任何有用的信息相关问题-但是只有在没有未解决的承诺的情况下。如果有人知道与永久退出/冻结有关的任何有用资源,请让我知道-我经常遇到这个问题,因此我可能会误会某些东西。

[一般来说,有没有办法判断是否有任何Node Promise待定(在项目的全局任何地方,而无需手动为每个Promise编写跟踪代码)?我也已经尝试了很长一段时间,但从未找到任何答案。如果我能找到答案,那么我可以手动运行当时需要的任何关闭功能,但是似乎没有办法做到这一点?

这是一个大项目,因此将await放在每个函数和查询的前面是不可行的,或者编写包装代码会做一些乏味的工作,例如在任何地方手动计算每个已创建/已解决的Promise(无论如何都是不可能的)考虑到承诺大部分是在node_module中生成的),我想我不是真的应该做的事吗?

回答如下:function doWork () { Promise.all([ createWombats(knex), cleanUpAardvarks(knex), optimiseLemurs(knex), ]) .then(knex.destroy) .catch(() => { console.error('Something terrible happened.') knex.destroy() }) }

如果每个实用程序函数都返回一个已解决或被拒绝的承诺,则所有操作都应以正确的顺序进行。假设您很高兴使用阻塞请求,则async / awaittry块也可以进行类似的处理。

本文标签: Knexjs