Javascript 为什么我的kafkajs客户端(Node.js/express.js)抛出';TypeError:topics.forEach不是函数';获取主题元数据时?
我正在尝试使用kafkajs管理客户端获取我的kafka代理“主题”元数据。我已经在Node.js+express.js中编写了我的服务器 这是我的Javascript 为什么我的kafkajs客户端(Node.js/express.js)抛出';TypeError:topics.forEach不是函数';获取主题元数据时?,javascript,node.js,apache-kafka,kafkajs,Javascript,Node.js,Apache Kafka,Kafkajs,我正在尝试使用kafkajs管理客户端获取我的kafka代理“主题”元数据。我已经在Node.js+express.js中编写了我的服务器 这是我的index.js文件,它是npm的入口点 'use strict'; const express = require('express'); const bodyParser = require('body-parser'); const Admin = require('./Admin/create-admin-client'); const T
index.js
文件,它是npm的入口点
'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const Admin = require('./Admin/create-admin-client');
const TopicMetaData = require('./Admin/topic-metadata-fetch');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
const adminConfig = new Admin({
clientId: 'admin-client-4981',
brokers: ['localhost:9092']
})
const admin = adminConfig.getAdmin();
.
..
...
// Handles the admin connection, disconnection, and other routes here
...
..
.
//This is where the error is
app.post('/api/v1/dev/admin/topicmetadata', (req, res) => {
const topic = req.body;
const topicmetadata = new TopicMetaData(admin);
topicmetadata.setTopicConfig(topic);
topicmetadata.commit(req, res);
});
app.listen(4040);
这是create admin client.js
文件,用于检索管理对象
'use strict';
const { Kafka } = require('kafkajs');
class Admin {
constructor(kafkaConfig) {
this.kafka = new Kafka({
clientId: kafkaConfig.clientId,
brokers: kafkaConfig.brokers
});
}
getAdmin() {
return this.kafka.admin();
};
}
module.exports = Admin;
这是获取主题元数据的topics metadata fetch.js
文件
'use strict';
class TopicMetaData {
constructor(admin) {
this.admin = admin;
}
setTopicConfig(topicConfig) {
this.topic = topicConfig;
}
commit(req, res) {
this.admin.fetchTopicMetadata({
topics: this.topic
})
.then((topics) => {
console.log("Topic MetaData Fetched Successfully!");
res.status(200).send({
topics
});
})
.catch((err) => {
console.error(err);
res.status(500).send(err);
})
}
}
module.exports = TopicMetaData;
每当我发送POST请求以获取主题的元数据时(例如“服务类型”,我已经成功创建了主题),其req.body
如下
{
"topic": "SERVICE-TYPES",
"partitions": [{
"partitionErrorCode": 0,
"partitionId": 0,
"leader": 0,
"replicas": [0],
"isr": [0]
}]
}
它返回一个
TypeError:topics.forEach不是一个函数
错误。哪里出错了?我发现我的http请求正文应该是以下结构:
{
"topics": [{
"topic": "SERVICE_TYPES",
"partitions": [{
"partitionErrorCode": 0,
"partitionId": 0,
"leader": 0,
"replicas": [0],
"isr": [0]
}]
}]
}
我的路径处理程序应该是:
app.get('/api/v1/dev/admin/topicmetadata', (req, res) => {
//topic should be array of the topics
const topic = req.body.topics;
const topicmetadata = new TopicMetaData(admin);
topicmetadata.setTopicConfig(topic);
topicmetadata.commit(req, res);
});
因此,我传递了错误的请求正文结构。代码中没有forEach,您从哪里得到错误消息?@Triby error在这一行TopicMetaData.commit()中的this.admin.fetchTopicMetadata()可以显示完整错误吗?@cricket\u 007抱歉,我发现我传递了错误的请求正文结构。我已经把答案贴在下面了。它解决了这个问题。我的错:P