为什么服务器发送或客户端在我的快递应用程序中通过socket.io接收数据?

时间:2014-01-10 04:16:03

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

我的节点应用程序通过其API向Salesforce发布一个对象(由客户端表单中收集的数据组成)。收到成功或错误消息后,我想将其发送到客户端,然后显示它。在我的简单节点/ 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帖子错误案例也没有向客户端显示任何内容。并且客户端或服务器控制台中没有任何错误可以与之抗争。

我很难过。请帮忙!

1 个答案:

答案 0 :(得分:0)

我会做这样的事情 -

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);
}