Node.js Class 中的缓冲区未定义
Node.js Buffer is undefined inside of a Class
我正在 node.js 中编写服务器。它在 Buffer
对象中向连接的客户端描述 3D World
。
这是我的代码。
var zlib = require("zlib");
var filesystem = require("fs");
var path = require("path");
class World {
constructor(name, x, y, z) {
this.data = Buffer.alloc(x * y * z);
this.name = name;
this.x = x;
this.y = y;
this.z = z;
try {
this.data = this.load();
} catch (er) {
console.warn("Couldn't load world from file, creating new one");
this.data.fill(0);
}
}
setNode(id, x, y, z) {
this.data.writeUInt8(id, 4 + x + this.z * (z + this.x * y));
}
getNode(block, x, y, z) {
return this.data.readUInt8(4 + x + this.z * (z + this.x * y));
}
dump() {
return this.data;
}
load() {
this.data = zlib.gunzipSync(filesystem.readFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`)));
}
save() {
filesystem.writeFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`), zlib.gzipSync(this.data));
}
}
module.exports = World;
在另一个文件中,然后我可以
var World = require("./lib/world.js");
var world = new World('example', 256, 64, 256);
但是,当尝试对缓冲区执行任何操作时,我收到与未定义值相关的错误。
console.log(world.dump());
undefined
我以为我的 node 安装坏了,所以我尝试制作一个内容如下的文件:
var test = Buffer.alloc(8);
console.log(test);
但这有效:
<Buffer 00 00 00 00 00 00 00 00>
然后我尝试编辑我的代码以初始化 class 之外的 Buffer
:
...
var test = Buffer.alloc(4194304);
console.log(test)
class World {
constructor(name, x, y, z) {
this.data = test;
console.log(this.data);
...
这产生了这个结果:
Buffer <00 00 00 00 00 00 00 00 [etc]>
undefined
有人可以解释我做错了什么吗?这以前有用过,所以我唯一能想到的就是把它移到 Class
以某种方式损坏 Buffer
s。
在您的 try/catch 块中,您将 this.data 设置为等于 this.load 的 return。在 this.load 内部你没有 returning 任何东西,这意味着函数将 return 未定义。您有两种方法可以解决此问题:
在 this.load 中,您可以简单地 return 值而不是将其设置为 this.data。
load() {
return zlib.gunzipSync(filesystem.readFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`)));
}
或者,更简单的方法是删除 this.data = this.load() 并简单地调用 this.load
try {
this.load();
} catch (er) {
console.warn("Couldn't load world from file, creating new one");
this.data.fill(0);
}
我正在 node.js 中编写服务器。它在 Buffer
对象中向连接的客户端描述 3D World
。
这是我的代码。
var zlib = require("zlib");
var filesystem = require("fs");
var path = require("path");
class World {
constructor(name, x, y, z) {
this.data = Buffer.alloc(x * y * z);
this.name = name;
this.x = x;
this.y = y;
this.z = z;
try {
this.data = this.load();
} catch (er) {
console.warn("Couldn't load world from file, creating new one");
this.data.fill(0);
}
}
setNode(id, x, y, z) {
this.data.writeUInt8(id, 4 + x + this.z * (z + this.x * y));
}
getNode(block, x, y, z) {
return this.data.readUInt8(4 + x + this.z * (z + this.x * y));
}
dump() {
return this.data;
}
load() {
this.data = zlib.gunzipSync(filesystem.readFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`)));
}
save() {
filesystem.writeFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`), zlib.gzipSync(this.data));
}
}
module.exports = World;
在另一个文件中,然后我可以
var World = require("./lib/world.js");
var world = new World('example', 256, 64, 256);
但是,当尝试对缓冲区执行任何操作时,我收到与未定义值相关的错误。
console.log(world.dump());
undefined
我以为我的 node 安装坏了,所以我尝试制作一个内容如下的文件:
var test = Buffer.alloc(8);
console.log(test);
但这有效:
<Buffer 00 00 00 00 00 00 00 00>
然后我尝试编辑我的代码以初始化 class 之外的 Buffer
:
...
var test = Buffer.alloc(4194304);
console.log(test)
class World {
constructor(name, x, y, z) {
this.data = test;
console.log(this.data);
...
这产生了这个结果:
Buffer <00 00 00 00 00 00 00 00 [etc]>
undefined
有人可以解释我做错了什么吗?这以前有用过,所以我唯一能想到的就是把它移到 Class
以某种方式损坏 Buffer
s。
在您的 try/catch 块中,您将 this.data 设置为等于 this.load 的 return。在 this.load 内部你没有 returning 任何东西,这意味着函数将 return 未定义。您有两种方法可以解决此问题:
在 this.load 中,您可以简单地 return 值而不是将其设置为 this.data。
load() {
return zlib.gunzipSync(filesystem.readFileSync(path.join(__dirname, `/worlds/${this.name}/world.buf`)));
}
或者,更简单的方法是删除 this.data = this.load() 并简单地调用 this.load
try {
this.load();
} catch (er) {
console.warn("Couldn't load world from file, creating new one");
this.data.fill(0);
}