【问题标题】:Why isn't the server sending or the client receiving data via socket.io in my express app?为什么在我的 express 应用程序中服务器没有通过 socket.io 发送或客户端接收数据?
【发布时间】:2014-01-10 14:41:49
【问题描述】:

我的节点应用程序通过其 API 向 Salesforce 发布一个对象(由在客户端的表单中收集的数据组成)。在收到成功或错误消息时,我想将其发送到客户端,然后显示它。在我的简单 node/express3 应用程序中,Socket.io 似乎是实现此目的的工具,但是 beyond the simple demo 我无法让数据在我的服务器和我的客户端之间传递。

我的相关服务器端代码:

var express = require('express');
var port = 5432;
var app = module.exports = express();
var server = require('http').createServer(app);
var nforce = require('nforce');
var org = nforce.createConnection({
  clientId: 'MY_CLIENT_ID',
  clientSecret: 'MY_CLIENT_SECRET',
  redirectUri: 'http://localhost:5432/oauth/_callback'
});
var io = require('socket.io').listen(server);

// here I authenticate with Salesforce, this works fine
app.post('/salesforce', function(req, res){
  var lead = nforce.createSObject('Lead');
  // here I construct the lead object, which also works fine
  org.insert(lead, oauth, function(err, res) {
    if (err === null) {
      console.log(res);
      leadSuccessMessage(res);
    }
    else {
      console.log(err);
      var error = {
        errorCode: err.errorCode,
        statusCode: err.statusCode,
        messageBody: err.messageBody
      };
      console.log(error);
      leadErrorMessage(error);
    }
  });
}
function leadSuccessMessage(res) {
  var resp = res;
  console.log('called success message from server');
  io.sockets.on('connection', function (socket) { 
    socket.emit('sfRes', resp);
    socket.on('thanks', function (data) {
      console.log(data);
    });
  });
}

function leadErrorMessage(error) {
  var err = error;
  console.log('called error message from server');
  io.sockets.on('connection', function (socket) {
    console.log("socket is: " + socket);
    socket.emit('sfRes', err);
    socket.on('thanks', function (data) {
      console.log(data);
    });
  });
}

还有我相关的客户端脚本:

<script src="/socket.io/socket.io.js"></script>
<script>
  current.page = document.URL;
  console.log("current page is: " + current.page);
  var socket = io.connect(current.page);
  socket.on('sfRes', function (data) {
    console.log("client received: " + data);
    fst.showLeadStatus(data);
    socket.emit('thanks', {message: "received server feedback"});
  });
</script>

当我使用辛辣的小 AJAX 调用发布包含有效数据的表单时:

postToSF: function(){
  $('#submitLead').on('click', function(e){
    e.preventDefault();
    var formData = $('#lead_form').serialize();
    $.ajax({
      type: 'POST',
      url: '/salesforce',
      data: formData,
      success: function(){
        fst.log('success!');
      },
      error: function(xhr, ajaxOptions, thrownError){
        console.error(xhr.status); // 0
        console.error(thrownError);
      }
    });
  });
}

我得到的只是眼泪,而这些在服务器端控制台中:

// the result of `console.log(res)`
{ id: '00Qa000001FZfhKEAT', success: true, errors: [] }
// and proof that `leadSuccessMessage()` got called
called success message from server

而不是像应有的那样从客户端对象调用此函数:

showLeadStatus: function(response){
  if (response.success) {
    fst.log("showing lead status as: " + response);
    $('#leadStatus').addClass('success').removeClass('error').fadeIn().delay(4000).fadeOut();
  }
  else {
    fst.log("showing lead status as: " + response);
    $('#leadStatus').text(response.messageBody).addClass('error').removeClass('success').fadeIn().delay('4000').fadeOut();
  }
  $('#startOver').click();
}

如果我在控制台中调用它并传递服务器应该通过套接字的数据,这会很好:

// this works, gosh darn it
fst.showLeadStatus({ id: '00Qa000001FZfhKEAT', success: true, errors: [] });

Salesforce 发布错误案例也不会向客户显示任何内容。并且客户端或服务器控制台中没有需要处理的错误。

我被难住了。请帮忙!

【问题讨论】:

    标签: ajax node.js express socket.io salesforce


    【解决方案1】:

    我会做这样的事情 -

    var mysocket = null;
    
    var io = require('socket.io').listen(server);
    io.sockets.on('connection', function (socket) {
        mysocket = socket;
        socket.on('thanks', function (data) {
          console.log(data);
        });
    });
    
    app.post('/salesforce', function(req, res){
     ....
     ....
    })
    
    function leadSuccessMessage(res) {
      var resp = res;
      console.log('called success message from server');
      if(mysocket)
        mysocket.emit('sfRes', resp);
    }
    
    function leadErrorMessage(error) {
      var err = error;
      console.log('called error message from server');
      if(mysocket)
        mysocket.emit('sfRes', err);
    }
    

    【讨论】:

    • 非常感谢!结合你的方法在第一次尝试时就奏效了。对于那些希望从我的无知中学习的人(如果我没有吸取教训,@vinayr 是正确的):
    • 1.如果您想在打开套接字后通过套接字传递数据,请确保事先声明了一个幽灵套接字对象,这样您就可以在有数据要发送时对该幽灵进行操作。 2. 不要在其他函数内部打开套接字连接
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多