Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Sequelize中的事务中使用循环和承诺_Javascript_Node.js_Express_Promise_Sequelize.js - Fatal编程技术网

Javascript 在Sequelize中的事务中使用循环和承诺

Javascript 在Sequelize中的事务中使用循环和承诺,javascript,node.js,express,promise,sequelize.js,Javascript,Node.js,Express,Promise,Sequelize.js,我目前正在构建一个Nodejs、Express、Sequelize(w.PostgreSQL)应用程序,在使用承诺以及事务和循环时遇到了一些问题 我试图弄清楚如何在事务中使用for循环。我正在尝试循环浏览成员列表,并在数据库中为每个成员创建一个新用户 我知道下面的代码是错误的,但它显示了我正在尝试做什么 谁能给我指出正确的方向吗 var members = req.body.members; models.sequelize.transaction(functio

我目前正在构建一个Nodejs、Express、Sequelize(w.PostgreSQL)应用程序,在使用承诺以及事务和循环时遇到了一些问题

我试图弄清楚如何在事务中使用for循环。我正在尝试循环浏览成员列表,并在数据库中为每个成员创建一个新用户

我知道下面的代码是错误的,但它显示了我正在尝试做什么

谁能给我指出正确的方向吗

        var members = req.body.members;
        models.sequelize.transaction(function (t) {
            for (var i = 0; i < members.length; i++) {
                return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) {
                    return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);});
                })
            };
        }).then(function (result) {
            console.log("YAY");
        }).catch(function (err) {
            console.log("NO!!!");
            return next(err);
        });
var members=req.body.members;
models.sequelize.transaction(函数(t){
对于(var i=0;i
你应该使用
承诺。所有

    var members = req.body.members;
    models.sequelize.transaction(function (t) {
        var promises = []
        for (var i = 0; i < members.length; i++) {
            var newPromise = models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t});
           promises.push(newPromise);
        };
        return Promise.all(promises).then(function(users) {
            var userPromises = [];
            for (var i = 0; i < users.length; i++) {
                userPromises.push(users[i].addInvitations([group], {transaction: t});
            }
            return Promise.all(userPromises);
        });
    }).then(function (result) {
        console.log("YAY");
    }).catch(function (err) {
        console.log("NO!!!");
        return next(err);
    });
var members=req.body.members;
models.sequelize.transaction(函数(t){
var承诺=[]
对于(var i=0;i
我认为您不需要在sequelize事务中捕获
,因为我认为它会跳出来捕获事务

抱歉格式化。在手机上


Promise.all将在运行之前等待所有承诺返回(或失败)。然后,
。然后,
回调将是来自每个数组的所有承诺数据

您需要使用bluebird的内置循环结构,该结构随sequelize一起提供:

var members=req.body.members;
models.sequelize.transaction(t=>
map(成员,m=>//创建所有用户
create({firstname:m,email:m,'pending':true},{transaction:t})
).map(user=>//然后为每个用户添加邀请
user.addInvitations([group],{transaction:t})//添加邀请
)).nodeify(next);//转换为express的节点错误返回语法
首先:

因此,很容易:

// requiring...
const async = require('async');

// exports...
createAllAsync: (array, transaction) => {
  return new Promise((resolve, reject) => {
    var results = [];
    async.forEachOf(array, (elem, index, callback) => {
      results.push(models.Model.create(elem, {transaction}));
      callback();
    }, err => {
      if (err) {
        reject(err);
      }
      else {
        resolve(results);
      }
    });
  });
}

根据你对Node.js的实现,这可能会有所帮助。我使用express、POSTGRES和sequelize进行了相同的设置

就我个人而言,我更喜欢async/await(ES6)实现,而不是then/catch,因为它更易于阅读。另外,创建一个可以在外部调用的函数可以提高可重用性

async function createMemeber(req) {
let members = req.body.members;
  for (var i = 0; i < members.length; i++) {
    // Must be defined inside loop but outside the try to reset for each new member;
    let transaction = models.sequelize.transaction();
    try { 
      // Start transaction block.
      let user = await models.User.create({'firstname':members[i],  'email':members[i], 'pending':true}, {transaction});
      await user.addInvitations([group], {transaction}));

      // if successful commit the record. Else in the catch block rollback the record.
      transaction.commit();
      // End transaction block.
      return user;
    } catch (error) { 
      console.log("An unexpected error occurred creating user record: ", error);
      transaction.rollback();
      // Throw the error back to the caller and handle it there. i.e. the called express route.
      throw error;
    }
  }
}
异步函数createMemeber(req){ 让members=req.body.members; 对于(var i=0;i
如果有人正在寻找使用async和Wait的typescript v4.0.5的解决方案,我的答案是这样的。也许您也可以在javascript应用程序中使用它,但这取决于它的版本

const array = ['one','two','three'];
const createdTransaction = sequelize.transaction();
    
const promises = array.map(async item => {
      await model.create({
          name: item,
      },
      { transaction: createdTransaction },
     );
});

Promise.all(promises).then(async values => {
    await createdTransaction.commit();
});

谢谢您的回答,但我收到一个错误,告诉我需要将承诺链返回到交易。尝试在每个承诺之前添加“return”。除我之外的所有人都会收到“此事务已调用未处理的拒绝提交(fc7be023-1980-455e-9934-7816420daa2b),您不能再使用它”是的,它错过了回报,而且没有任何东西会被推到用户承诺上。@BenjaminGruenbaum谢谢我昨天在手机上做了这件事,从来没有机会回来检查它,我会在收到通知后更新can@BenjaminGruenbaum我仍然收到对该事务调用的
未处理拒绝提交
错误,即使有return还可以工作,并且代码非常优雅。无法获取
.nodeify(错误)虽然可以工作。它说错误没有定义。以前没有使用过nodeify,因此我可能遗漏了一些内容。应该是nodeify(下一个)-sorryProperty“map”在类型“PromiseConstructor”上不存在。欢迎使用堆栈溢出,感谢您提供答案。请审查: