2016-03-20 13 views
1

Ich versuche, sqlite3 in einer Express-App zu verwenden. Grundsätzlich bekomme ich eine Ruheanforderung, basierend auf der Ruheanforderung, ich eine externe REST-Anfrage abfragen. Zwischen der Antwort von der externen Anfrage & die Daten von der ursprünglichen REST-Anfrage übergeben, mache ich dann ein Update oder Einfügen in eine meiner sqlite3-Tabellen.nodejs sqlite3 db.run als Bluebird Versprechen

Das Problem, das ich renne, ist, dass in db.run(sqlStatement, paramArray, function(err)), die Funktion (err) ist ein Rückruf, wobei err ist entweder ein Fehler, oder ein nil. Wenn der err Parameter außerdem null ist, dann enthält die this Referenz 2 Eigenschaften, von denen einer mir die Anzahl der Zeilen angibt, die von der Anweisung geändert werden. (https://github.com/mapbox/node-sqlite3/wiki/API#databaserunsql-param--callback als Referenz)

Das Ding ist, ich laufe drossel des promisifyAll auf dem sqlite3-Modul, und verwenden Sie dann die resultierende

db.runAsync(sqlStatement, paramArray).then(err) { 
    console.log(this) //results in a null 
} 

Also nicht in der Lage bin ich aus tatsächlich auf Figur ob alles aktualisiert wurde.

Mein ganzer Abschnitt des Codes sieht ein wenig wie folgt aus:

function handleRequest(req, res) { 

    //this returns the response as the first object 
    request.getAsync('http://www.example.com', reqObj)   
     .then(prepareDbObjects) //prepares an array of objects to update the DB with 
     .then(attemptUpdate) 
     .then(function(rowsUpdated) { 
      res.json(rowsUpdated) 
     } 
} 

function attemptUpdate(updateObjs) { 
    var promiseMap = Promise.map(updateObjs, function(singleObj) { 
     return updateOrInsertObj(singleObj) 
    } 
    return promiseMap 
} 


function updateOrInsertObj(singleObj) { 
    return db.runAsync(sqlStatement, singleObj) 
     .then(function(err) { 
      if(err) { 
       //handle error 
      } else { 
       console.log("this should be an object with 2 properties", this) 
       //but instead it is null 
      } 
     } 
} 

Antwort

3

Ich ging in den node-sqlite3 Code suchen, und ich bin mir ziemlich sicher, dass die Art und Weise es this in der erfolgreichen Callback-Funktion zurückgibt, anstatt als ein tatsächlicher Parameter, ist das Problem. Das bedeutet, dass selbst der Versuch, den Parameter multiArgs=true von bluebird zu verwenden, nicht funktionierte, da kein richtiger Rückgabewert vorhanden war.

Also habe ich versucht, die db.run-Funktion in meiner eigenen benutzerdefinierten Methode zu umbrechen, und das schien den Trick zu tun.

Insbesondere, ich habe:

function runCustomAsync(sql, params) { 
    return new Promise(function(resolve, reject) { 
     db.run(sql, params, function cb(err) { 
      if(err) { 
       var responseObj = { 
        'error': err 
       } 
       reject(responseObj); 
      } else { 
       var responseObj = { 
        'statement': this 
       } 
       resolve(responseObj); 
      } 
     }); 
    }); 
} 

db.runCustomAsync = runCustomAsync; 
module.exports = db; 

Es ist ein wenig anders aus, wie es normalerweise gehandhabt wird. Ich gebe jetzt ein Objekt zurück, das entweder das Objekt this enthält oder das Objekt err enthält.

In meinem ursprünglichen Wunsch, das tue ich jetzt

db.runCustomAsync(sqlStatement, params) 
    .then(function(dbResponseObj) { 
     if(dbResponseObj.error) { 
      //handle error 
     } else { 
      //do stuff with dbResponseObj.statement 
     } 
    }) 
+2

, wenn Sie 'ablehnen anrufen()', warum es treffen würde '.then()'? – Danosaure

Verwandte Themen