LaV*_*che 5 asynchronous node.js promise async-await knex.js
我刚刚开始在使用 Node.js 的命令行脚本项目中使用 Knex.js。
我已经让它工作了,并且可以运行查询等。但是当我的脚本完成时(并且所有待处理的承诺都已解决),Node 进程会永远挂起,直到我用ctrl+c.
我是否需要做一些事情来告诉 Knex 断开与数据库的连接 - 但只有在所有查询完成后?
我尝试将其作为脚本的结尾:
knex.destroy();
Run Code Online (Sandbox Code Playgroud)
...但这只会立即终止连接,即如果有一个尚未完成的查询的待处理承诺,它就会立即被终止,我得到:
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().
Run Code Online (Sandbox Code Playgroud)
...我明白错误是什么,它在我的一个查询完成之前就终止了连接。我只是不知道如何解决当没有什么可做的时候把事情完成的总体问题。
我已经使用 Node 和 Promise/async/await 几年了,但我似乎经常遇到这些问题,除非我专门编写代码来关闭数据库连接和类似的事情,否则进程最终会冻结。 ..它通常做得太早了。我已经阅读了许多有关异步/承诺的资源,但我从未能够找到与节点进程关闭/退出相关的任何有用信息 - 但只有在没有未解决的承诺的情况下。如果有人知道与此退出/永远冻结相关的任何有用资源,请告诉我 - 这似乎是我经常遇到的问题,所以我可能会误解某些内容。
更一般地说,有没有什么方法可以判断是否有任何 Node Promise 处于待处理状态(项目中全局的任何位置,而无需为每个 Promise 手动编写跟踪代码)?我也想弄清楚这个问题很长时间,但从未找到答案。如果我能找到这一点,那么我可以手动运行当时需要的任何关闭函数,但似乎没有办法做到这一点?
这是一个很大的项目,因此不可能将await每个函数和查询放在前面,或者编写包装代码来完成繁琐的事情,例如手动计算每个地方创建/解决的承诺(无论如何,考虑到承诺大多是不可能的)在node_module中生成),我猜这并不是我应该做的事情?
听起来好像你只需要始终回报承诺。在调用代码时,您不会在 Promise 解析之前随意退出节点进程,关闭数据库连接也是如此。所以像这样的结构变得有用:
function doWork () {
Promise.all([
createWombats(knex),
cleanUpAardvarks(knex),
optimiseLemurs(knex),
])
.then(knex.destroy)
.catch(() => {
console.error('Something terrible happened.')
knex.destroy()
})
}
Run Code Online (Sandbox Code Playgroud)
如果每个实用函数都返回已解决或已拒绝的承诺,则一切都应该按正确的顺序发生。假设您乐意使用阻塞请求,则可以使用async/await和块进行类似的处理。try
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |