回调不是函数 - castv2

callback is not a function - castv2

我正在关注这个 http://siglerdev.us/blog/2021/02/26/google-home-message-broadcast-system-node-js/31,它使用这个库 castv2-client 向我的 google 家发送消息。有用。我收到消息没问题,但代码抛出

C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\receiver.js:72
    callback(null, response.status.volume);
    ^

TypeError: callback is not a function
    at C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\receiver.js:72:5                                                                  ver.js:72
    at fn.onmessage (C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\request-response.js:27:7)
    at fn.emit (events.js:203:15)
    at Channel.onmessage (C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\controller.js:16:10)                                           s\receiver.js:72:5
    at Channel.emit (events.js:198:13)                                              lib\controllers\request-response.js:27:7)
    at Client.onmessage (C:\Users\Phil\Documents\google home\node_modules\castv2\lib\channel.js:23:10)                                                                  ient\lib\controllers\controller.js:16:10)
    at Client.emit (events.js:203:15)
    at PacketStreamWrapper.onpacket (C:\Users\Phil\Documents\google home\node_module\channel.js:23:10)s\castv2\lib\client.js:81:10)
    at PacketStreamWrapper.emit (events.js:198:13)                                  s\castv2\lib\client.js:81:10)
    at TLSSocket.<anonymous> (C:\Users\Phil\Documents\google home\node_modules\castv2\lib\packet-stream-wrapper.js:28:16)                     

抛出此消息的代码有什么问题 AND/OR 我该如何修复它,以便它更优雅地捕获错误并且不会抛出,因为消息仍然传送到 google 家或修复它根本不扔这个? 感谢您的帮助!

我相信它在它引用的 castv2-client 库中,但我没能使它开心。

ReceiverController.prototype.launch = function(appId, callback) {
  this.request({ type: 'LAUNCH', appId: appId }, function(err, response) {
    if(err) return callback(err);
    if(response.type === 'LAUNCH_ERROR') {
      return callback(new Error('Launch failed. Reason: ' + response.reason));
    }
    callback(null, response.status.applications || []);
  });
};

我的代码

var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
const googleTTS = require('google-tts-api');

var App = {
  playin: false,
  DeviceIp: "",
  Player: null,
  GoogleHome: function (host, url) {
    var client = new Client();
    client.connect(host, function () {
      client.launch(DefaultMediaReceiver, function (err, player) {
        client.setVolume({ level: 1 });
        var media = {
            contentId: url,
            contentType: 'audio/mp3',
            streamType: 'BUFFERED'
        };
        App.Player = player;
        App.Player.load(media, { autoplay: true }, function (err, status) {
            App.Player.on('status', function (status) {
                if (status.playerState === "IDLE" && App.playin === false) {
                    client.close();
                }
            });
        });
    });
});
client.on('error', function (err) {
  console.log('Error: %s', err.message);
  client.close();
});
},
run: function (ip, text) {
  App.DeviceIp = ip;
  const url = googleTTS.getAudioUrl(text, {
      lang: 'en-US',
      slow: false,
      host: 'https://translate.google.com',
  });
  App.GoogleHome(App.DeviceIp, url, function (res) {
      console.log(res);
  })
},
broadcast: function(text){
  const ips = '192.168.0.15'.split(","); //From config, 192.168.68.105,192.168.68.107,192.168.68.124
  for (var s of ips){
      App.run(s, text);
  }
}
}

App.broadcast("Broadcasted to all of the devices"); //Only works if you did step 4.5

您报告的错误:

C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\receiver.js:72
    callback(null, response.status.volume);
    ^

TypeError: callback is not a function
    at C:\Users\Phil\Documents\google home\node_modules\castv2-client\lib\controllers\receiver.js:72:5    

好像跟你的client:

中方法setVolume的调用有关
client.setVolume({ level: 1 });

请考虑复习 castv2-client 库中 receiver.jssource code

ReceiverController.prototype.setVolume = function(options, callback) {
  var data = {
    type: 'SET_VOLUME',
    volume: options // either `{ level: 0.5 }` or `{ muted: true }`
  };


  this.request(data, function(err, response) {
    if(err) return callback(err);
    callback(null, response.status.volume);
  });
};

库正在声明,因为您在调用该函数时没有提供正确的回调。

我从未使用过该库,但提供类似于以下回调的内容可能会有所帮助:

client.setVolume({ level: 1 }, function(err, volume) {
  if (err) {
    // Handle error as appropriate
    console.log('Error on setVolume:', err);
  } else {
    console.log('Volume:', volume)
  }
  
});

您的最终代码如下所示:

var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
const googleTTS = require('google-tts-api');

var App = {
  playin: false,
  DeviceIp: "",
  Player: null,
  GoogleHome: function (host, url) {
    var client = new Client();
    client.connect(host, function () {
      client.launch(DefaultMediaReceiver, function (err, player) {
        client.setVolume({ level: 1 }, function(err, volume) {
          if (err) {
            // Handle error as appropriate
            console.log('Error on setVolume:', err);
          } else {
            console.log('Volume:', volume)
          }
        });

        var media = {
            contentId: url,
            contentType: 'audio/mp3',
            streamType: 'BUFFERED'
        };
        App.Player = player;
        App.Player.load(media, { autoplay: true }, function (err, status) {
            App.Player.on('status', function (status) {
                if (status.playerState === "IDLE" && App.playin === false) {
                    client.close();
                }
            });
        });
    });
});
client.on('error', function (err) {
  console.log('Error: %s', err.message);
  client.close();
});
},
run: function (ip, text) {
  App.DeviceIp = ip;
  const url = googleTTS.getAudioUrl(text, {
      lang: 'en-US',
      slow: false,
      host: 'https://translate.google.com',
  });
  App.GoogleHome(App.DeviceIp, url, function (res) {
      console.log(res);
  })
},
broadcast: function(text){
  const ips = '192.168.0.15'.split(","); //From config, 192.168.68.105,192.168.68.107,192.168.68.124
  for (var s of ips){
      App.run(s, text);
  }
}
}

App.broadcast("Broadcasted to all of the devices"); //Only works if you did step 4.5