Node.js - 使用 'async' 和 'await' 和 sequelize ORM
Posted
技术标签:
【中文标题】Node.js - 使用 \'async\' 和 \'await\' 和 sequelize ORM【英文标题】:Node.js - Using 'async' and 'await' with sequelize ORMNode.js - 使用 'async' 和 'await' 和 sequelize ORM 【发布时间】:2018-11-27 03:29:18 【问题描述】:我一直在尝试找出如何使 sequelize 与“async”和“await”一起工作。 我能找到的关于该主题的最佳信息是此线程中的答案: Node.js 7 how to use sequelize transaction with async / await?
但我不能让它在我的项目中发挥作用。我一直在删减部分代码以使其更简单,这样我就可以找出到底是什么不正确并最终得到如下结果:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('zas', 'zas', 'saz123',
host: 'someHost',
dialect: 'mysql',
);
//test
let transaction;
var SimpleInspectionModel = require('../models/simpleInspectionModel.js')(sequelize, dataTypes: Sequelize.DataTypes );
try
// get transaction
transaction = await sequelize.transaction();
// step 2
await SimpleInspectionModel.find(, transaction);
// commit
await transaction.commit();
catch (err)
// Rollback transaction if any errors were encountered
await transaction.rollback();
无论何时运行,这段代码都会输出这种错误:
transaction = 等待续集.transaction(); ^^^^^
SyntaxError: await 仅在异步函数中有效
在 Object.runInThisContext 的 createScript (vm.js:80:10) (vm.js:139:10) 在 Module._compile (module.js:616:28) 在 Module.load 中的 Object.Module._extensions..js (module.js:663:10) (module.js:565:32) 在 tryModuleLoad (module.js:505:12) 在 Function.Module._load (module.js:497:3) 在 Function.Module.runMain (module.js:693:10) 在启动时 (bootstrap_node.js:191:16) 在 bootstrap_node.js:612:3
package.json 中的项目依赖:
“正文解析器”:“^1.18.3” “快递”:“^4.16.3”, “快速会话”:“^1.15.6”, “文件系统”:“^2.2.2”, "mysql2": "^1.5.3", “续集”:“^4.37.10”
节点 v8.11.3
【问题讨论】:
错误信息告诉你到底出了什么问题,你只能在async function
块内使用await
。
@BenFortune 是对的。您必须将您的代码块在其中的方法或函数声明为async
或使用(async function() … your code goes here … )
将使用await 的代码包装在自调用异步函数中编辑:或将其包装在实际函数中并调用它
【参考方案1】:
您只能在异步函数中使用await
,而不能在顶层使用。 support top-level await 有一个提案,但目前 JS 不支持。改为这样做:
let transaction;
var SimpleInspectionModel = require('../models/simpleInspectionModel.js')(sequelize, dataTypes: Sequelize.DataTypes );
run().catch(error => console.log(error.stack));
async function run()
try
// get transaction
transaction = await sequelize.transaction();
// step 2
await SimpleInspectionModel.find(, transaction);
// commit
await transaction.commit();
catch (err)
// Rollback transaction if any errors were encountered
await transaction.rollback();
Sequelize transactions support promises,所以你应该可以将 sequelize 与 async/await 一起使用。我对 Sequelize 了解不多,但我写了一篇关于使用 async/await with Mongoose 的博客文章,这是 MongoDB 的一个类似工具,可能有助于阅读。
【讨论】:
Sequelize 文档明确说要使用“等待”,并且根本没有提到使用事务。我猜是错误的信息。【参考方案2】:我的两分钱:如果您正在使用随后要调用的类方法,请确保再次使用 async/await。您的类方法应该在异步函数中使用 await 调用。您必须在调用堆栈的每个步骤中使用 async/await。
【讨论】:
以上是关于Node.js - 使用 'async' 和 'await' 和 sequelize ORM的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 7 的 async await 终于来了,不过怎么觉得没啥用
Node.js 使用 async/await 和 mysql
使用 Node.js、Async 和 Formidable 处理错误
使用 Node.js、Async 和 Formidable 处理错误
使用 Javascript(以及 Node.js)使用 async/await 和 Promises 的正确方法是啥 [重复]