2017-12-15 3 views
0

Ich benutze Knex in Loopback für DB-Betrieb mit MySQL. Meine Aufgabe besteht darin, die 2 Tabelle mit der Transaktion zu aktualisieren. Wenn ich einen neuen Eintrag in einem Tab eingeben, möchte ich die ID dieses Eintrags für den zweiten Abfragevorgang verwenden.Knex-Transaktion funktioniert nicht in Nodejs

Aber wenn die Transaktion den Fehler wirft, wird die Daten nicht zurückgesetzt/der erste Tabelleneintrag wird entfernt, wenn der zweite Tabelleneintrag einen Fehler auslöst. aber in meinem Fall Transaktion immer Begeht nicht, dass ich in meinem Beispiel unten setzen Code Rollback:

addTest : (data) => { 
    return new promise(function(resolve, reject) { 
    knex.transaction(function(t) { 
     return knex('foo') 
     .transacting(t) 
     .insert({ 
      foo_id: data.foo_id ? data.foo_id : null, 
      foo_name: data.foo_name ? data.foo_name : null, 
      date_entered : new Date() 
     }) 
     .then(function() { 
      return knex('bar') 
      .transacting(t) 
      .insert({ 
      bar_id: data.bar_id ? data.bar_id : null, 
      bar_name : data.bar_name ? data.bar_name : null 
      }) 

     }) 
     .then(t.commit) 
     .catch(function(e) { 
      t.rollback(); 
      throw e; 
     })  
    }) 
    .then(function() { 
    // it worked 
    // resolve('sucess'); 
    console.log('success'); 
    }) 
    .catch(function(e) { 
    // it failed 
    console.log('error'+e); 
    }); 
    }); 
} 

bitte, geben Sie mir geeigneten Vorschlag. danke

Antwort

0

Sie können vermeiden, t.commit oder t.rollback selbst anrufen müssen. Siehe the docs.

Sie Ihr Code innerhalb der Transaktionsfunktion so etwas wie dieses

return t.insert({}).into('foo').returning('id') .then(function(idArray) { return t.insert({fooId: idArray[0]}).into('bar') })

Das Knex die commiting behandeln lässt und rollt sich wieder basierend auf dem Ergebnis Ergebnis dieses Versprechen. Beachten Sie auch, wie ich die eingefügte fooId eingegeben und auf das Objekt bar für insert angewendet habe. Das wurde in der Frage erwähnt.

+0

Ihre nicht definierte Bindung ist, weil eine Spalte nicht in Ihrer Datenbank ist; Die Abfrage kann nicht eingefügt werden. Der ganze Rest ist schwer zu verstehen, ohne den Code zu sehen, den Sie verwenden, um diesen Fehler zu bekommen (und die Definition Ihrer DB-Tabellen) – clay

+0

Mein Code ist in oben erklärt –

+0

Wie in der Dokumentation, wenn 'knex.transaction (function (t) {'gibt ein Versprechen zurück (wie Ihres), wird es' t.commit' und 't.rollback' basierend auf der Auflösung dieses Versprechens automatisch aufrufen. Ihr Code, der es ebenfalls anruft, ist wahrscheinlich die Ursache Ihres Problems (außer dem Undefinierte Bindung und nicht die erste eingefügte ID in der zweiten Abfrage verwenden. Entweder rufen Sie 't.commit'' t.rollback' selbst auf und geben kein Versprechen zurück, oder geben eine Versprechenskette zurück und lassen Knex die Auflösung der Transaktion behandeln. – clay

Verwandte Themen