Javascript Node.js内存泄漏?

Javascript Node.js内存泄漏?,javascript,node.js,memory-leaks,Javascript,Node.js,Memory Leaks,我有一个内存泄漏,我不知道为什么。这是基于我之前制作的一个脚本,效果很好。我所做的只是更改变量的名称和一的值 这是导致我内存泄漏的代码 console.log("Mine plugin started.") var mineflayer = require('mineflayer'); var vec3 = mineflayer.vec3; module.exports.inject = inject; function inject(bot) { var Mine = false bot

我有一个内存泄漏,我不知道为什么。这是基于我之前制作的一个脚本,效果很好。我所做的只是更改变量的名称和一的值

这是导致我内存泄漏的代码

console.log("Mine plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;

function inject(bot) {

var Mine = false

bot.on('whisper', function (username, message) {
    if (username == bot.username) return;
    if (message == 'mine') {
        Mine = true
        gotoBlo()
}
    if (message == 'stop') {
        Mine = false
}
});

function gotoBlo() {
    if (Mine = true) {
        posBlo = bot.entity.position;
        blockBlo = findBlock('diamond_ore', 8, posBlo);
        if (blockBlo != null) {
        var tempVar = vec3(blockBlo.position.x, blockBlo.position.y, blockBlo.position.z);
        bot.scaffold.to(tempVar)
        setTimeout(gotoBlo,5000)
        }
    }
}

function findBlock(type, size, point) {
    var block = null;
    var shortest = null;
    var x1 = Math.floor(point.x - size);
    var x2 = Math.floor(point.x + size);
    var y1 = Math.floor(point.y - size);
    var y2 = Math.floor(point.y + size);
    var z1 = Math.floor(point.z - size);
    var z2 = Math.floor(point.z + size);
    //bot.chat(x1 + "");

    for (x = x1; x < x2; x++) {
        for (y = y1; y < y2; y++) {
            for (z = z1; z < z2; z++) {

                var cPoint = vec3(x, y, z);
                var cBlock = bot.blockAt(cPoint);
                //bot.chat(cPoint + "");
                if (cBlock) {
                    //bot.chat(cBlock.name);
                    if (cBlock.name == type) {
                        if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
                            shortest = cPoint.distanceTo(point);
                            block = cBlock;
                        }
                    }
                }
            }
        }
    }

    return block;
}
}
console.log(“我的插件启动了”)
var mineflayer=require('mineflayer');
var vec3=mineflayer.vec3;
module.exports.inject=注入;
功能注入(bot){
var Mine=错误
bot.on('whisper',函数(用户名、消息){
如果(username==bot.username)返回;
如果(消息==‘我的’){
我的=真的
gotoBlo()
}
如果(消息==‘停止’){
我的=错
}
});
函数gotoBlo(){
如果(我的=真){
posBlo=bot.entity.position;
blockBlo=findBlock(“钻石矿”,8,posBlo);
if(blockBlo!=null){
var tempVar=vec3(blockBlo.position.x,blockBlo.position.y,blockBlo.position.z);
bot.scaffold.to(tempVar)
设置超时(gotoBlo,5000)
}
}
}
函数findBlock(类型、大小、点){
var block=null;
var=null;
var x1=数学地板(x点-尺寸);
var x2=数学地板(x点+尺寸);
变量y1=数学地板(点y-尺寸);
变量y2=数学地板(点y+尺寸);
var z1=数学地板(z点-尺寸);
var z2=数学地板(z点+尺寸);
//聊天机器人(x1+“”);
对于(x=x1;xcPoint.distanceTo(point))| |最短==null){
最短=点到(点)的距离;
block=cBlock;
}
}
}
}
}
}
返回块;
}
}
下面是工作正常的代码

console.log("Defuse plugin started.")
var mineflayer = require('mineflayer');
var vec3 = mineflayer.vec3;
module.exports.inject = inject;

function inject(bot) {

var Disarm = false

bot.on('whisper', function (username, message) {
    if (username == bot.username) return;
    if (message == 'defuse') {
        disarm = true
        gotoTNT()
}
    if (message == 'stop') {
        disarm = false
}
});

function gotoTNT() {
    if (disarm = true) {
        posTNT = bot.entity.position;
        blockTNT = findBlock('tnt', 32, posTNT);
        if (blockTNT != null) {
        var tempVar = vec3(blockTNT.position.x, blockTNT.position.y, blockTNT.position.z);
        bot.scaffold.to(tempVar)
        setTimeout(gotoTNT,5000)
        }
    }
}

function findBlock(type, size, point) {
    var block = null;
    var shortest = null;
    var x1 = Math.floor(point.x - size);
    var x2 = Math.floor(point.x + size);
    var y1 = Math.floor(point.y - size);
    var y2 = Math.floor(point.y + size);
    var z1 = Math.floor(point.z - size);
    var z2 = Math.floor(point.z + size);
    //bot.chat(x1 + "");

    for (x = x1; x < x2; x++) {
        for (y = y1; y < y2; y++) {
            for (z = z1; z < z2; z++) {

                var cPoint = vec3(x, y, z);
                var cBlock = bot.blockAt(cPoint);
                //bot.chat(cPoint + "");
                if (cBlock) {
                    //bot.chat(cBlock.name);
                    if (cBlock.name == type) {
                        if ((shortest > cPoint.distanceTo(point)) || shortest == null) {
                            shortest = cPoint.distanceTo(point);
                            block = cBlock;
                        }
                    }
                }
            }
        }
    }

    return block;
}
}
console.log(“解除插件启动”)
var mineflayer=require('mineflayer');
var vec3=mineflayer.vec3;
module.exports.inject=注入;
功能注入(bot){
var Disarm=false
bot.on('whisper',函数(用户名、消息){
如果(username==bot.username)返回;
如果(消息=='defuse'){
解除武装=正确
gotoTNT()
}
如果(消息==‘停止’){
解除武装=错误
}
});
函数gotoTNT(){
如果(解除武装=真){
posTNT=bot.entity.position;
blockTNT=findBlock('tnt',32,posTNT);
if(blockTNT!=null){
var tempVar=vec3(blockTNT.position.x,blockTNT.position.y,blockTNT.position.z);
bot.scaffold.to(tempVar)
设置超时(gotoTNT,5000)
}
}
}
函数findBlock(类型、大小、点){
var block=null;
var=null;
var x1=数学地板(x点-尺寸);
var x2=数学地板(x点+尺寸);
变量y1=数学地板(点y-尺寸);
变量y2=数学地板(点y+尺寸);
var z1=数学地板(z点-尺寸);
var z2=数学地板(z点+尺寸);
//聊天机器人(x1+“”);
对于(x=x1;xcPoint.distanceTo(point))| |最短==null){
最短=点到(点)的距离;
block=cBlock;
}
}
}
}
}
}
返回块;
}
}
基于,看起来您在
eventEmitter
上超过了默认的maxListener计数,因此它向您发出警告,指出这可能是一个错误(它无法知道这是否是实际错误)。如果这是一种预期行为,您可以使用
setMaxListeners()
增加最大限制,如下所示

下面是对
EventEmitter
对象的引用

发射器.setMaxListeners(n)

默认情况下,如果超过10,EventEmitter将打印警告 为特定事件添加侦听器。这是一个有用的默认值 这有助于查找内存泄漏。显然,并不是所有的发射器都应该这样 限10人。此功能允许增加该值。着手 无限(或0)表示无限

返回发射器,因此可以链接调用

由于您在问题中包含的特定代码没有直接添加任何事件侦听器,因此我们很难知道您的代码是否在做不应该做的事情。我看到的唯一值得研究的代码是
bot.scaffold.to(…)
以查看
bot
对象内部的功能


正如我在评论中提到的,还有几个其他编码错误:

您声明:

var Disarm = false
然后,设置:

disarm = true
这两个变量应该是相同的情况


这:

应改为:

if (disarm == true)
或者更简单,只是:

if (disarm)  
if(disarm=true)
将分配
disarm=true
,然后评估结果,该结果将始终为
true
,因此
if
语句从未做过有用的事情。检查条件是否与
=
==
相等,而不是与
=
相等


然后,您的变量
x
y
z
在使用之前需要使用
var x、y、z
声明,以便它们是适当的局部变量,而不是隐式全局变量



仅供参考,您可以将代码粘贴到中,以获得关于您可能犯了一些错误的建议。

t中有多个错误
if (disarm)