【问题标题】:Client server in ExpressExpress中的客户端服务器
【发布时间】:2015-02-08 21:41:02
【问题描述】:

如何在客户端向 javascript 发送一个对象? 我之前问了一个问题,并被回答并接受了这个问题,因为我无法在电脑上查看答案: Client receive json object to javascript

我仍然不明白如何将数据发送到我尝试 req.send/render 的客户端,但它没有在客户端运行。

客户:

$.get('127.0.0.1:3000', {mydata: 'content'}, function(response){
   //callback triggered when server responds
   console.log(JSON.stringify(response));
});

服务器:

  app.get('/', function (req, res) {
      if(req.params.mydata === 'content'){
        res.end("you sent content");
      }  else {
        res.end("you sent something else");
      }
    });

谢谢!

【问题讨论】:

  • 好的。启动应用程序后,如果您向localhost:3000(或127.0.0.1:3000))发出浏览器请求,您是否收到回复,例如"you sent something else"
  • 是的。你可以简单地说我的问题是如何让它写“你发送的内容”
  • 不错。所以你已经在服务器中完成了"send the data to the client" 部分。现在,您必须调试客户端。您在浏览器控制台中看到什么了吗?如果你在 ajax 请求的回调中只放了一个console.log('test'),你能看到它被记录了吗?
  • 但即使我删除了上面显示的客户端部分,它也显示您发送了其他内容。我不确定我是否理解你。我打开浏览器并在控制台中写道:console.log('test') 并得到:2 test undefined
  • 没问题。当我告诉你在回调中放置console.log('test') 时,我的意思是把它放在你的客户端代码中,例如:$.get('127.0.0.1:3000', {mydata: 'content'}, function(response){ //callback triggered when server responds console.log('test'); });。只是看看你的客户端代码是否真的在执行回调。

标签: javascript node.js express


【解决方案1】:

您想使用res.json,而不是使用res.end——这将适当地设置HTTP Content-Type 标头,以便您的数据实际上作为JSON 传递。这是一个示例路线:

app.get('/', function(req, res) {
  if (req.params.mydata === 'content') {
    res.json({ message: 'you sent content' });
  } else {
    res.json({ message: 'you sent something else' });
  }
});

希望有帮助!

【讨论】:

  • 感谢您的回答。但我问如何使用此代码发送客户端数据,不一定是 json,任何数据
  • 啊,在这种情况下,您可以使用 res.send() - 但问题是,这在您的示例中不起作用,因为您的 jQuery 代码专门寻找 JSON 内容 - 那是为什么我说使用res.json。如果您想发送非 JSON 数据,请继续做您正在做的事情,但修改您的 jQuery 代码以查找字符串而不是 JSON。
【解决方案2】:

使用res.send()

app.get('/', function (req, res) {
    req.params.mydata === 'content'
        ? res.send("you sent content")
        : res.send("you sent something else");
});

【讨论】:

    【解决方案3】:

    在你的服务器代码中,当你这样做时:

    req.params.mydata
    

    ,您正在尝试从映射到您的其中一条路线的属性中获取 mydata,例如:

    'http://127.0.0.1:1337/:mydata'
    

    这不是你的情况。您正在通过查询字符串发送对象{mydata: 'content'},例如:

    'http://127.0.0.1:1337/?mydata=content'
    

    因此,要在您的服务器代码上获取此数据,您必须这样做:

    if (req.query.mydata === 'content') {
      // do something
    }
    

    甚至

    if (req.param('mydata) === 'content') {
      // do something
    }
    

    有关如何处理接收到的数据的更多信息,请查看express.js Request docs。 正如@rdegges 指出的,如果你想发送json 数据,你应该使用res.json 而不是res.end。但是,就您而言,由于您是从客户端发出请求并拥有No 'Access-Control-Allow-Origin'(您在 cmets 中说过),因此您有两种选择:

    • 按照here 的说明设置服务器响应的标头,或者;
    • 让您的服务器代码返回一个jsonp 响应,而不仅仅是json,例如res.jsonp({ message: 'you sent content' });

    如果您选择第二个选项,您应该准备您的客户端代码来处理这个问题,添加 dataType: 'jsonp':

    $.ajax({
      url: 'http://127.0.0.1:1337/',
      data: {
        mydata: "content"
      },
      dataType: 'jsonp',
      success: function (json) {
        console.log(json);
      },
      error: function (jqXHR, error, errorThrown) {
        console.log(error);
      },
      type: 'GET'
    });
    

    【讨论】:

    • 首先,非常感谢您的帮助!我尝试这样做并得到错误:发送后无法设置标题。我认为这是因为我在这些行之前有 res.render('main') 并且此页面包含客户端的 javascript
    • 是的,没错。如果您在 res.end()res.send() 或其他任何内容之前调用 res.render(),则会收到错误消息,因为响应已发送。
    • 根据您在问题中所说的,我了解到您已经在浏览器中加载了客户端,并希望向服务器端发出请求,并检索数据。
    • 在 app.get('/') 我想发送要显示的页面以及数据。只是尝试了 res.render('main',data) 并没有用
    猜你喜欢
    • 2014-02-18
    • 2021-07-30
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2018-05-01
    • 2017-05-31
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多