我是 Node 流的新手,并试图弄清楚为什么事情没有按预期工作。我只是在练习,想做一个愚蠢的变换。
interface MyTransformStreamOptions {
[key: string]: any
}
class MyTransformStream extends Transform {
constructor(options) {
options.readableObjectMode = true;
options.writableObjectMode = true;
super(options);
}
_transform(chunk, encoding, callback) {
console.log('encoding: ' + encoding);
// chunk should be an object here, due to
// readableObjectMode = true right?
const newObj = {};
for (const [key, value] of Object.entries(chunk)) {
console.log(`[key, value]: [${key}, ${value}]`);
newObj['aa' + key] = 'bb' + value;
}
callback(null, newObj);
}
}
const myTransformStream = new MyTransformStream({} as MyTransformStreamOptions);
process.stdin
.pipe(myTransformStream)
.pipe(process.stdout);
最后我运行脚本并通过标准输入输入:
{ car: 'honda', truck: 'mazda' }
我也试过:
"{ car: 'honda', truck: 'mazda' }"
但是循环将块视为字符串而不是对象。所以我看到如下输出:
[key, value]: [0, 123]
[key, value]: [1, 32]
...etc...
我尝试了以下各种组合:
options.readableObjectMode = true/false;
options.writableObjectMode = true/false;
并且还在_transform()
使用:
const obj = JSON.parse(chunk.toString());
butobj
从来都不是一个对象,而是一个字符串。
我的目标是在我的转换流中接收一个对象,改变它,然后输出它。但是我只能处理字符串,即使使用JSON.parse()
.
我在哪里错了?
更新 - 部分解决方案
问题出在我使用JSON.parse()
. 我试图解析:
{ car: 'honda', truck: 'mazda' }
哪个是有效的 JS,但不是有效的 JSON,呵呵!
然而,更大的问题仍然存在。我已将 Transform 流设置为: writableObjectMode = true
,但是当我这样做时:
callback(null, newObj);
我得到错误:
TypeError: Invalid data, chunk must be a string or buffer, not object
如果我做:
callback(null, JSON.stringify(newObj));
事情按预期工作。
但是,考虑到我已经在对象模式下设置了东西,这不应该在没有字符串化的情况下工作吗?