async/await如何在sequelize中应用
发布于 6 年前 作者 iori2882 7028 次浏览 来自 问答

看了网上的教程,下面的代码我能理解,返回值必须是一个Promise对象,使用await的时候必须包裹在async内 123.png 麻烦大家了,我不知道如何在sequelize中应用!比如下面我之前的代码,我在不改动代码的情况下,可以在外面直接使用await调用么?如果不可以应该怎样改写啊?不明白不明白…

    add : function (ItemsApplication,callback) { 
        console.log("Access The Method[addBasicSettings] Starting...");
        var option = {
            isNeedId:true,
            isNeedUUId:true,
            pkColumn:'items_app_id'
        };
        var ItemsApplicationModel = _getModel('sys_org_items_app','/src/box/models/ItemsApplicationModel',option);
        _dbManager.transaction(function (t) {
            return ItemsApplicationModel.create(ItemsApplication,{
                transaction : t
            }).then(function (result) {
                return callback(null,result);
            })
        }).catch(function (err) {
            console.log("具体信息:"+err);
            _LogUtil.writeErrorMsg( err.message);
            return callback(new Error('添加失败'));
        });
    },};\n```
	
	能在不改上面的代码的情况下像下面那样直接调用?
	await ItemController.add(item1,function (err,result2) 
	await ItemController.add(item2,function (err,result2)
13 回复

既然用 await ,就不应该有回调了

try{
	const result =	await ItemController.add(item1) 
}catch(e){
}

你把这个add方法改造下返回promise不就好了

来自酷炫的 CNodeMD

sequelize 本身支持 promise。

 const asyncPS = async function () {
    await ItemController.add(item1,function (err,result2) 
    await ItemController.add(item2,function (err,result2)
  };
  asyncPS();

@zy445566 大神,你说的对,我在网上没找到改造add方法的教程啊!

@liangtongzhuo 直接用就行么?

@zy445566 或者说 我想实现托管的事务处理(如下代码),那么数据库方法要做什么样的改变啊? await sequelize.transaction( async t=>{ const user = User.create( { name: “Alex”, pwd: “2dwe3dcd” }, { transaction: t} ) const group = Group.findOne( { name: “Admins”, transaction: t} ) // etc. })

@iori2882 为什么还要这样写,直接这样写不就好了,保证是同一个连接不就好了 ,正好之前裸写过一次,给你了。 https://github.com/zy445566/myBlog/blob/master/20180414block-run/index.js image.png

@iori2882 事务的栗子

let transaction;    

try {
  // get transaction
  transaction = await sequelize.transaction();

  // step 1
  await Model.destroy({where: {id}, transaction});

  // step 2
  await Model.create({}, {transaction});

  // commit
  await transaction.commit();

} catch (err) {
  // Rollback transaction if any errors were encountered
  await transaction.rollback();
}

参考地址:https://stackoverflow.com/questions/42870374/node-js-7-how-to-use-sequelize-transaction-with-async-await/43342688

@zy445566 嗯,这个是不是直接使用mysql的底层写法啊?我这里用的sequelize框架~~~~~

@liangtongzhuo 谢谢哥们,我试试,这个应该是手动提交的,不能像下面那样自动提交么? await sequelize.transaction( async t=>{ const user = User.create( { name: “Alex”, pwd: “2dwe3dcd” }, { transaction: t} ) const group = Group.findOne( { name: “Admins”, transaction: t} ) // etc. })

@iori2882

transaction = await sequelize.transaction({ autocommit: true});

官方地址:http://docs.sequelizejs.com/manual/tutorial/transactions.html

@liangtongzhuo 十分感谢!!!

回到顶部