如何解决错误:typeerror:无法读取未定义的属性“foreach”?

m2xkgtsf  于 2021-06-04  发布在  Kafka
关注(0)|答案(0)|浏览(285)

我已经用express.js创建了一个restapi并想连接kafka。我的 KafkaService 等级如下:

  1. var express = require('express');
  2. var kafka = require('kafka-node');
  3. class KafkaServices{
  4. constructor(){
  5. this.Producer = kafka.Producer,
  6. this.client = new kafka.KafkaClient();
  7. this.producer = new kafka.Producer(this.client);
  8. this.payloads = [];
  9. if(!!KafkaServices.instance){
  10. return KafkaServices.instance;
  11. }
  12. KafkaServices.instance = this;
  13. return this;
  14. }
  15. connect(){
  16. // Create a connection
  17. this.producer.on('ready', function() {
  18. console.log('Kafka connection established');
  19. })
  20. }
  21. error(){
  22. // Check for Errors
  23. this.producer.on('error', function(err) {
  24. console.log('Kafka has the following error');
  25. console.log(err);
  26. })
  27. }
  28. setPayload(payload){
  29. // Set paylaod
  30. this.payloads = payload
  31. }
  32. publish(){
  33. //Publish
  34. this.producer.send(this.payload, function (err, data) {
  35. console.log('Kafka has published the following payload:');
  36. console.log(data);
  37. console.log(err);
  38. });
  39. }
  40. }
  41. module.exports = KafkaServices;

server.js 我正在访问 KafkaServices 要连接到kafka并在连接不成功时检查错误,请执行以下操作:

  1. var KafkaServices = require('./services/kafka-services');
  2. kafka = require('kafka-node');
  3. function onListening() {
  4. var addr = server.address();
  5. var bind = typeof addr === 'string'
  6. ? 'pipe ' + addr
  7. : 'port ' + addr.port;
  8. console.log('Listening on ' + bind);
  9. logInfo({message: `Server is Listening on http://localhost:${addr.port}.`, scope: 'Server'});
  10. kafkaTool = new KafkaServices();
  11. // Connect to kafka
  12. kafkaTool.connect();
  13. kafkaTool.error();
  14. }

settings-router.js 我有我的post方法,在该post方法中,我想将有效负载发布到kafka,如下所示:

  1. const express = require('express');
  2. const router = express.Router();
  3. var kafka = require('kafka-node');
  4. const KafkaServices = require('../services/kafka-services');
  5. const { settings } = require('../app');
  6. router.post('/', (req, res, next) => {
  7. console.log("Posting...");
  8. try{
  9. kafkaTool = new KafkaServices();
  10. kafkaTool.setPayload(req.body);
  11. kafkaTool.publish();
  12. console.log('Payload has been published to Kafka');
  13. }
  14. catch(err){
  15. console.log('Error Caught');
  16. console.log(req.body);
  17. console.log(err);
  18. }
  19. return res.status(200).json({
  20. message: 'Setting details',
  21. payload: req.body
  22. });
  23. });
  24. module.exports = router;

当前,当我尝试发布时,出现以下错误:

  1. TypeError: Cannot read property 'forEach' of undefined
  2. at Producer.BaseProducer.buildPayloads (C:\Users\ENV\Projects\settingtool\node_modules\kafka-node\lib\baseProducer.js:125:12)
  3. at Producer.BaseProducer.send (C:\Users\ENV\Projects\settingtool\node_modules\kafka-node\lib\baseProducer.js:120:34)
  4. at KafkaServices.publish (C:\Users\ENV\Projects\settingtool\src\services\kafka-services.js:45:23)
  5. at router.post (C:\Users\ENV\Projects\settingtool\src\routes\settings-router.js:12:19)
  6. at Layer.handle [as handle_request] (C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\layer.js:95:5)
  7. at next (C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\route.js:137:13)
  8. at Route.dispatch (C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\route.js:112:3)
  9. at Layer.handle [as handle_request] (C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\layer.js:95:5)
  10. at C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\index.js:281:22
  11. at Function.process_params (C:\Users\ENV\Projects\settingtool\node_modules\express\lib\router\index.js:335:12)

我不完全确定如何克服这个错误,特别是因为这个错误是指 node_modules 是从哪来的 npm install node-kafka . 如有任何建议,将不胜感激。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题