OrienDb.RequestError: Found unknown session x

OrienDb.RequestError: Found unknown session x

我正在使用 OrientJs 通过 node.js 与 OrientDB 通信。 在检查他是否存在后,我已经实施了 API 将新用户插入数据库。

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) 是一个函数,如果用户确实存在,return 为真,否则为假。 从 Postman 调用 thi api 时,我收到此错误消息:

{ 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 }

消息是Found unknown session 13,但我每次调用该服务时都会将数字增加2。

如果我将代码放在 fetcher.userExists(db, username, password).then(function (exists) {..then 块之外的 if(!exists){} 语句中,它可以正常工作,但这样做我可以检查用户是否存在。我能弄清楚问题出在哪里。有人能帮我吗?谢谢。

注意:我使用的是 OrientDB Community 2.2.24

问题是 fetcher.userExists(db, username, password) 中的数据库连接,在该方法中,我进行了查询以查找用户是否存在(与我在发布的代码中所做的类似)。所以,我用 db.open() 打开了连接,然后在返回结果之前,我简单地执行了 db.close() 就关闭了它。我没有正确关闭它。 db.close() 之后的代码应该在 then 块中,像这样:

//...
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) }
            })
        })
    })
}

因此,在 fetcher.userExists(db, username, password) 中打开连接后,就像我尝试打开一个新连接并在旧连接关闭之前执行查询一样。将代码放在 db.close() 之后的 then() 中可以避免这种情况。