我一直试图找出如何使用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
答案 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。