Node.js - 使用' async'和等待'等待'与sequ​​elize ORM

时间:2018-06-18 09:55:24

标签: javascript node.js orm async-await sequelize.js

我一直试图找出如何使用async' asquile来进行续作。等待'等待。 我在这个主题上找到的最好的信息是这个帖子的答案: 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 = await sequelize.transaction();                   ^^^^^

     

SyntaxError:await仅在异步函数

中有效      

在Object.runInThisContext的createScript(vm.js:80:10)处   (vm.js:139:10)在Module._compile(module.js:616:28)at   Module.load中的Object.Module._extensions..js(module.js:663:10)   (module.js:565:32)在tryModuleLoad(module.js:505:12)at at   Function.Module.runMain中的Function.Module._load(module.js:497:3)   (module.js:693:10)启动时(bootstrap_node.js:191:16)at   bootstrap_node.js:612:3

package.json中的项目依赖项:

"身体解析器":" ^ 1.18.3" "表达":" ^ 4.16.3", " express-session":" ^ 1.15.6", "文件系统":" ^ 2.2.2", " mysql2":" ^ 1.5.3", " sequelize":" ^ 4.37.10"

Node v8.11.3

2 个答案:

答案 0 :(得分: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的类似工具,可能对阅读有帮助。

答案 1 :(得分:-1)

我的两分钱:如果您正在使用随后要调用的类方法,请确保再次使用async / await。您的类方法应在异步函数中使用await进行调用。您必须在调用堆栈的每个步骤中使用async / await。