发送下游消息到与节点js谷歌ccs

我正在使用node-xmpp连接到谷歌gcm ccs服务器。 我跟着从谷歌谷歌组连接。 现在我需要发送一个下游消息,每当我收到来自我的redis订阅者的消息(我订阅了一个redis channel redis节点包 )。 我的代码如下

var gearmanode = require('gearmanode'); var redis = require("redis"); var xmpp = require('node-xmpp'); var gearJob; var redisSubChan = 'test_channel'; var gearmanJobName = 'reverse'; var jobPayload; var redisClient; var xmppClient; var gearClient; gearClient = gearmanode.client(); var options = { type: 'client', jid: 'myid@gcm.googleapis.com', password: 'myserverkey', port: 5235, host: 'gcm.googleapis.com', legacySSL: true, preferredSaslMechanism: 'PLAIN' }; console.log('creating xmpp app'); xmppClient = new xmpp.Client(options); xmppClient.connection.socket.setTimeout(0) xmppClient.connection.socket.setKeepAlive(true, 10000) redisClient = redis.createClient(); redisClient.subscribe(redisSubChan); redisClient.on("message", function(channel, message) { console.log('received message'); console.log(message); message = JSON.parse(message); //send the messages to google ccs server via xmpp var payload = { "to": message.to, "message_id": message.message_id, "data": message.data, "time_to_live": message.time_to_live, "delay_while_idle": message.delay_while_idle }; var jsonPayload = JSON.stringify(payload); console.log(jsonPayload); var ackToDevice = new xmpp.Element('message', {'id': ''}).c('gcm', {xmlns: 'google:mobile:data'}).t(jsonPayload); console.log('prepared message'); console.log(ackToDevice.root().toString()); xmppClient.send(ackToDevice); console.log('sent!!!'); }); xmppClient.on('online', function() { console.log("online"); }); xmppClient.on('connection', function() { console.log('online'); }); xmppClient.on('stanza', function(stanza) { if (stanza.is('message') && stanza.attrs.type !== 'error') { // Best to ignore an error console.log("Message received"); //Message format as per here: https://developer.android.com/google/gcm/ccs.html#upstream var messageData = JSON.parse(stanza.getChildText("gcm")); if (messageData && messageData.message_type != "ack" && messageData.message_type != "nack") { var ackMsg = new xmpp.Element('message', {'id': ''}).c('gcm', {xmlns: 'google:mobile:data'}).t(JSON.stringify({ "to": messageData.from, "message_id": messageData.message_id, "message_type": "ack" })); //send back the ack. xmppClient.send(ackMsg); console.log("Sent ack"); //receive messages from ccs and give it to PHP workers gearClient.submitJob(gearmanJobName, JSON.stringify(messageData), {background: true}); } else { //Need to do something more here for a nack. console.log("message was an ack or nack...discarding"); } } else { console.log("error"); console.log(stanza); } }); xmppClient.on('authenticate', function(opts, cb) { console.log('AUTH' + opts.jid + ' -> ' + opts.password); cb(null); }); xmppClient.on('error', function(e) { console.log("Error occured:"); console.error(e); console.error(e.children); }); 

我能够接收来自ccs服务器的消息,但不能通过消息callback从redis发送下游消息。

我得到以下错误

 error { name: 'message', parent: null, attrs: { id: '', type: 'error', to: '1026645507924@gcm.googleapis.com/8DF23ED7', 'xmlns:stream': 'http://etherx.jabber.org/streams' }, children: [ { name: 'gcm', parent: [Circular], attrs: [Object], children: [Object] }, { name: 'error', parent: [Circular], attrs: [Object], children: [Object] } ] } 

我试图打印(之后节点xmpp )的xmpp节之前发送和它一样

/ /我的消息的日志

 <message id=""><gcm xmlns="google:mobile:data">{"to":"APA91bHIGZcbePZ-f1jSyWQkBAJMHorHJiwgtN1GWITzcHf6uyVOZ3k7AasUiB-vBix32ucSypin3xDTYmoxqSc_ZmTDTuKjuDQ8BPQLpC41SqYRimm-hn34ZjSAF4uQO0OP1LSbqUxjh2WF0K5n4KyD3-Vn8ghASQ","message_id":84,"data":{"test":"sample data to send"},"time_to_live":0,"delay_while_idle":false}</gcm></message> 

正如他们在文档( 请求格式 )中提到的那样。 我的代码有什么问题?

我遇到过同样的问题。 这几乎使我疯狂,但最终它只是一个无效的JSON格式错误。

我想messageData.from或messageData.message_id没有被转换成正确的JSON格式。 在我的情况下,我传递了一个标量和JSON.stringify()没有将其转换为string。 因此,结果是 – >“message_id”:1234而不是“message_id”:“1234”

快速的答案是你不能使用CCS(XMPP)而不把你的项目列入白名单。 如果您尝试使用smack库,则会出现错误,说明您的项目未列入白名单。