无法通过在 node.js 中切片来修改数组

Posted

技术标签:

【中文标题】无法通过在 node.js 中切片来修改数组【英文标题】:Cannot modify array by slicing in node.js 【发布时间】:2016-02-20 20:48:09 【问题描述】:

我有这个外部定义,它封装了一个缓冲区和对该缓冲区执行操作的函数。

var Packer = 
    _buffer: new Buffer(""),

    readShort: function()
        var rs = this._buffer.readInt16BE();
        console.log('first buffer len ' + this._buffer.length);
        this._buffer = this._buffer.slice(2);
        console.log('second buffer len ' + this._buffer.length);
        return rs;
    ,

    readString: function()
        var len = this.readShort();
        console.log('while reading string len is ' + len);
        var rs = this._buffer.toString('utf8', 2, len + 2);
        this._buffer = this._buffer.slice(len + 2);
        return rs;
    ,
;

exports.Packer = Packer;

在外部,我称之为:

var HelloBob = 
    handlePacket: function(p)
         //.. p is a string
         p = new Buffer(p);

         var packer = Object.spawn(pack.Packer, _buffer: p);

         //Bob is trying to improve his knowledge
         var humansOnMoon = packer.readShort();
         var nameOfGalaxy = packer.readString();
    ,
;

问题是缓冲区在 readShort 操作后没有更新(这意味着切片会切掉缓冲区的一部分)。

first buffer len 354
second buffer len 354
while reading string len is 354

我读到切片内存与原始缓冲区共享内存后产生的缓冲区。我还尝试复制缓冲区(重叠)以删除前 (2) 个元素,但它的行为相同。

为什么会发生这种情况,我该如何解决?

注意事项:

p 是一个长度为 354 的缓冲区 Docs

【问题讨论】:

切片数组的代码应该可以正常工作,还有其他事情吗?您可能两次都访问同一个数组,要么是因为它还没有改变,要么是因为你做错了什么。需要注意的是,你返回的不是修改后的缓冲区,而是readInt16BE()的结果? @adeneo 实际上,我正在返回从缓冲区读取的值。目的是在同一个缓冲区上再次调用读取,但读取以下值不同的值(这就是我对缓冲区进行切片的原因) 我认为你必须发布你如何调用函数,以及 Object.spawn 做了什么等。 @adeneo 即使 readShort 函数中的两个日志之间,length 的值也不会发生变化。 您是否尝试在缓冲区上调用 toString 以查看是否发生变化,这可能是记录实时“对象”(缓冲区)的问题 【参考方案1】:

我设法通过一个函数(而不是通过初始化程序)设置 _buffer 变量来修复它。不知何故,如果我在 中设置它,它的行为就好像它是不可变的。

var packer = Object.spawn(pack.Packer, );
packer.setBuffer(new Buffer(p));

添加了这个设置器:

setBuffer: function(nbf)
    this._buffer = nbf;

【讨论】:

听起来更像是一个范围问题,this 不是你想的那样,this 的值取决于执行上下文,换句话说,这完全取决于Object.spawn 函数有效

以上是关于无法通过在 node.js 中切片来修改数组的主要内容,如果未能解决你的问题,请参考以下文章

nod-red学习笔记

如何解决 Node.js 中的“请求过多”错误?

Node.js Promises:异步推送到数组并保存

在node.js中的Webscraper,JS修改了DOM

slice切片做函数参数

在 Elastic Beanstalk 上扩展 Nginx - Node JS