2017-08-16 2 views
0

J'utilise OrientJs pour communiquer avec OrientDB via node.js. J'ai implémenté une API pour insérer un nouvel utilisateur dans la base de données, après avoir vérifié s'il existe.OrienDb.RequestError: session inconnue trouvée x

var dbServer = OrientDB({ 
    host: 'localhost', 
    port: 2424, 
    username: 'root', 
    password: 'password' 
}); 

// Connect to db 'test' 
var db = dbServer.use({ 
    name: 'mydbtest', 
    username: 'root', 
    password: 'my_root_password' 
}) 

// Set the server... 

app.post('/insertUser/', function (req, res) { 
    let username = req.body.username 
    let password = req.body.password 

    //Checks on username and password ... 

    let fetcher = require('../fetcher/fetcher') 
    fetcher.userExists(db, username, password).then(function (exists) { 
     console.log(exists) //exists = true/false 
     if (!exists) { 
      db.open().then(
       db.let('user', function (user) { 
        user.create('vertex', 'User') 
         .set({ 
          username: username, 
          password: password 
         }) 
       }).commit().return('$user').one().then(function (result) { 
        db.close() 
        if (!result.undefined) { res.status(200).send(true) } 
        else { res.status(200).send(false) } 
       }).catch(function (e) { // The error is caught here 
        db.close() 
        console.error(e); 
        res.status(500).send({ message: 'Unable to save new user1' }) 
       }) 
      ).catch(function (e) { 
       db.close() 
       res.status(500).send({ message: 'Unable to save new user' }) 
      }) 
     } 

     else res.status(200).send(false) 
    }) 
}) 

fetcher.userExists(db, username, password) est une fonction qui retourne true si l'utilisateur existe, sinon false. Lorsque vous appelez thi api de Postman, je reçois ce message d'erreur:

{ OrientDB.RequestError 
at child.Operation.parseError (C:\Users\sdp\node_modules\orientjs\lib\transport\binary\protocol33\operation.js:896:13) 
at child.Operation.consume (C:\Users\sdp\node_modules\orientjs\lib\transport\binary\protocol33\operation.js:487:35) 
at Connection.process (C:\Users\sdp\node_modules\orientjs\lib\transport\binary\connection.js:410:17) 
at Connection.handleSocketData (C:\Users\sdp\node_modules\orientjs\lib\transport\binary\connection.js:301:20) 
at emitOne (events.js:115:13) 
at Socket.emit (events.js:210:7) 
at addChunk (_stream_readable.js:252:12) 
at readableAddChunk (_stream_readable.js:239:11) 
at Socket.Readable.push (_stream_readable.js:197:10) 
at TCP.onread (net.js:588:20) 
name: 'OrientDB.RequestError', 
message: 'Found unknown session 13', 
data: {}, 
previous: [], 
id: 1, 
type: 'com.orientechnologies.common.io.OIOException', 
hasMore: 0 } 

Le message est Found unknown session 13, mais il augmente le nombre de 2 à chaque fois que j'appelle le service.

Si je mets le code dans la déclaration if(!exists){} hors du bloc then de fetcher.userExists(db, username, password).then(function (exists) {.. il fonctionne très bien, mais cela je ne peux donc vérifier si l'utilisateur existe. Je peux comprendre quel est le problème. Est-ce que quelqu'un peut m'aider? Merci.

Note: J'utilise OrientDB communautaire 2.2.24

+0

Bonjour, est-il possible que votre session soit expirée ou temporairement déconnectée? –

Répondre

0

La question était la connexion db dans le fetcher.userExists(db, username, password), Dans cette méthode, je fait une requête pour trouver si l'utilisateur existe (d'une manière similaire que je fais dans le code que j'ai posté). Donc, j'ai ouvert la connexion avec db.open() et puis, avant de retourner le résultat, je l'ai fermé en effectuant simplement db.close(). Je ne l'ai pas fermé correctement. Le code après db.close() doit être dans le bloc then, comme ceci:

//... 
if (!exists) { 
    db.open().then(
     db.let('user', function (user) { 
      user.create('vertex', 'User') 
       .set({ 
        username: username, 
        password: password 
       }) 
     }).commit().one().then(function (result) { 
      db.close().then(function(){  // <--- ADD then BLOCK HERE 
       if (!result.undefined) { res.status(200).send(true) } 
       else { res.status(200).send(false) } 
      }) 
     }) 
    }) 
} 

Ainsi, après l'ouverture de la connexion à fetcher.userExists(db, username, password) était comme je l'ai essayé d'ouvrir une nouvelle connexion et d'exécuter la requête avant que l'ancien a été fermé. Mettre le code dans then() après db.close() éviter cela.