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 的正确方法是啥 [重复]

node.js-4