d-v*_*ine 5 javascript node.js knex.js
我有一个 node.js 后端,它使用 Knex.js 从各种输入动态构建数据库查询。一些输入需要异步处理。我的问题是,我无法从异步函数(或当然在 Promise 解析函数中)返回 knex 查询对象,因为这会触发查询的执行。目前,我需要先处理所有异步输入,然后再将它们交给查询构建函数,但这确实限制了它们的可组合性。有没有办法阻止 Knex 在异步上下文中执行查询对象?
感谢 Mikael Lepist\xc3\xb6\ 的回答,我知道了如何解决这个问题。正如他指出的那样,Knex 查询是thenables凭借then函数而实现的。JavaScript的await关键字实际上调用then您提供给它的任何对象的函数,无论是否promise。因此,为了防止在等待(或.then())上执行查询,您可以删除/重命名查询then函数。例如
const getQuery = async () => {\n const qb = knex("users")\n .select("id")\n .limit(100);\n qb.promise = qb.then;\n qb.then = undefined;\n return qb;\n};\n\nconst query = await getQuery();\nconsole.log(query.toString());\nconsole.log(await query.promise());\nRun Code Online (Sandbox Code Playgroud)\n\n更新,警告:不要在家里尝试这个孩子:)
\n\n我觉得有必要指出迈克尔在评论中的有效批评。这是编写您自己的包装类的一种老套且潜在危险的捷径,可能会使您的代码更难理解。但我也坚持我的评估,即在我的特定用例中使用正确的 TypeScript 键入,这是一个有效且高效的解决方案。
\n\nUPDATE2:现在不会弄乱原型了:)。在实例上将 .then 设置为 undefined 效果很好。
\n