Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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
Node.js 查询数据库时express.js内存泄漏_Node.js_Express_Memory Leaks_Sequelize.js - Fatal编程技术网

Node.js 查询数据库时express.js内存泄漏

Node.js 查询数据库时express.js内存泄漏,node.js,express,memory-leaks,sequelize.js,Node.js,Express,Memory Leaks,Sequelize.js,我目前正在与express.js中的内存泄漏作斗争。通过注释代码的其余部分,我设法将范围缩小到以下内容: const db = require("../models") class AuthorizationService { constructor(app) { this.db = db(app) } async retrieveRealmByDeviceId(req) { await this.db.Device.find({

我目前正在与express.js中的内存泄漏作斗争。通过注释代码的其余部分,我设法将范围缩小到以下内容:

const db = require("../models")

class AuthorizationService {

    constructor(app) {
        this.db = db(app)
    }

    async retrieveRealmByDeviceId(req) {
        await this.db.Device.find({
            where: {
                id: "1"
            }
        })
    }
}

module.exports = AuthorizationService
const Sequelize = require("sequelize")

module.exports = (sequelize, DataTypes) => {

    const Device = sequelize.define("device", {
        id: {
            type: Sequelize.STRING,
            primaryKey: true,
            unique: true
        },
        userIdentifier: {
            type: Sequelize.STRING
        }
    })

    Device.associate = (models) => {
        Device.hasMany(models.AuthenticationChallenge, {
            as: "ACS",
            foreignKey: "deviceId",
            sourceKey: "id",
            onDelete: "cascade"
        })
        Device.hasMany(models.DeviceCertificate, {
            as: "DCS",
            foreignKey: "deviceId",
            sourceKey: "id"
        })
        Device.belongsTo(models.Realm, {
            foreignKey: "realmId",
            targetKey: "id"
        })
        Device.belongsToMany(models.Certificate, {
            as: "CS",
            through: models.DeviceCertificate,
            foreignKey: "deviceId",
            otherKey: "certificateId",
            constraints: false
        })
    }

    return Device
}
给定的代码与原始代码不同,但它仍然会导致泄漏。我还不熟悉express.js,并且正在与代码结构作斗争,因为这是一个带有遗留代码的项目

。/models
文件夹包含一组使用Sequelize定义的模型,例如:

const db = require("../models")

class AuthorizationService {

    constructor(app) {
        this.db = db(app)
    }

    async retrieveRealmByDeviceId(req) {
        await this.db.Device.find({
            where: {
                id: "1"
            }
        })
    }
}

module.exports = AuthorizationService
const Sequelize = require("sequelize")

module.exports = (sequelize, DataTypes) => {

    const Device = sequelize.define("device", {
        id: {
            type: Sequelize.STRING,
            primaryKey: true,
            unique: true
        },
        userIdentifier: {
            type: Sequelize.STRING
        }
    })

    Device.associate = (models) => {
        Device.hasMany(models.AuthenticationChallenge, {
            as: "ACS",
            foreignKey: "deviceId",
            sourceKey: "id",
            onDelete: "cascade"
        })
        Device.hasMany(models.DeviceCertificate, {
            as: "DCS",
            foreignKey: "deviceId",
            sourceKey: "id"
        })
        Device.belongsTo(models.Realm, {
            foreignKey: "realmId",
            targetKey: "id"
        })
        Device.belongsToMany(models.Certificate, {
            as: "CS",
            through: models.DeviceCertificate,
            foreignKey: "deviceId",
            otherKey: "certificateId",
            constraints: false
        })
    }

    return Device
}
我不确定还需要什么其他信息,但请务必让我知道

是什么导致了这次泄漏?我怎样才能发现它

编辑:

我们刚刚了解了如何解决泄漏问题,通过介绍:

await this.db.sequelize.close()
根据文档::“关闭此sequelize实例使用的所有连接,并释放所有引用,以便可以对该实例进行垃圾收集


然而,这种选择似乎是为了保持DB连接正常,可能是出于性能原因。如果我们以这种方式管理连接,是否会出现某种瓶颈或其他数据库性能问题?或者我们应该在请求期间保持连接?简而言之,在express.js中管理连接的正确方法是什么?

我从不喜欢这个
this.db=require(“../models”)(app)
。。。哦,当然,它只是传递了一个应用程序的引用。。。但从来没有这种感觉。无论如何,把
const db=require(“../models”)
放在顶部,然后把
this.db=db(app)
;,怎么样?
this.db
有没有清理过?@CodyG.,请看我更新!泄漏仍然存在。@jfriend00我怎么做?管理您的连接可能取决于您的db服务器硬件和db类型(postgres、ms sql…),但也取决于读取