将对象从节点服务器发送到客户端的javascript

时间:2016-09-23 01:32:10

标签: javascript node.js http

我有一个非常简单的服务器:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {

  res.writeHead(200, { 'Content-Type': 'text/html' });
  fs.readFile('index.html', 'utf-8', function (err, content) {
    if (err) {
      res.end('something went wrong.');
      return;
    }
    res.end(content);
  });

}).listen(8080);
console.log("Server running on port 8080.")

这需要渲染我的html,但现在我想发送一个对象。像这样:

var arr = [1,2,3];

我希望能够使用js在客户端操作此对象。所以除了知道如何从服务器发送到客户端之外,我想知道如何在客户端接收它,如果这是有道理的。

我正在努力了解幕后发生的事情,所以我不想使用快递。

3 个答案:

答案 0 :(得分:0)

一般来说,通过HTTP协议可以交换的唯一内容是数据。不是对象,不是html文件,只是数据。 将对象转换为数据并返回的过程称为序列化。 对于简单对象的特定情况,您可以使用JSON内置对象来序列化对象。

在服务器:

var data = JSON.stringify(arr); 
res.end(data);

在客户:

var arr = JSON.parse(data);

关于如何在客户端上询问和接收数据,请尝试使用Google搜索XmlHTTPRequest。

根据要求,添加功能齐全的服务器端代码:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {

  res.writeHead(200, { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*' });
  var data = JSON.stringify([1, 2, 3]);
  res.end(data);

}).listen(8080);
console.log("Server running on port 8080.")

Access-Control-Allow-Origin标头才能在控制台中运行您的代码(它被称为' CORS'并且意味着可以从其他域上托管的页面请求此端点)

答案 1 :(得分:0)

只需更改响应类型并将JSON字符串化:

http.createServer(function (req, res) {

    var arr = [1,2,3];
    res.writeHead(200, { 'Content-Type': 'application/json'});
    res.end(JSON.stringify(content), 'utf-8');

}).listen(8080);

答案 2 :(得分:0)

好吧好像我做错了几件事。它主要与服务器上的路由有关。这就是我试过的事情:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {

  var arr = [1, 2, 3];
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(arr), 'utf-8');

}).listen(8080);
console.log("Server running on port 8080.")

在客户端我有这样的事情:

xmlhttp = new XMLHttpRequest();
   xmlhttp.open("GET","http://localhost:8080/", true);
   xmlhttp.onreadystatechange=function(){
         if (xmlhttp.readyState==4 && xmlhttp.status==200){
          console.log(JSON.parse(xmlhttp.responseText));
         }
   }
   xmlhttp.send();

由于某种原因,console.log永远不会发生,我只会在页面上打印数组。但是通过像这样添加一些路由到我的服务器,它起作用了:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {

   if (req.method === 'GET' && req.url === '/') {

    res.writeHead(200, { 'Content-Type': 'text/html' });
    fs.readFile('index.html', 'utf-8', function (err, content) {
      if (err) {
        res.end('something went wrong.');
        return;
      }
      res.end(content);
    });
  }

  if (req.method === 'GET' && req.url === '/data') {
    var arr = [1, 2, 3];
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(arr), 'utf-8');
  }



}).listen(8080);
console.log("Server running on port 8080.")