如何创建从 nodejs mysql 模块获取的正确 json 类型数据?

Posted

技术标签:

【中文标题】如何创建从 nodejs mysql 模块获取的正确 json 类型数据?【英文标题】:How to create a proper json type data which has been fetched from nodejs mysql module? 【发布时间】:2016-04-22 10:22:32 【问题描述】:

伙计们,我从事网络项目已经很长时间了。我现在正在创建一个实时通知系统,我正在使用node js + socket io。我很高兴在*** 上的专家的帮助下我能够在不同的 port 上工作 apache servernodejs server 一起为一个完整的 Web 应用程序工作。好的,现在让我们进入正题。

与我的逻辑人员一起,我试图通过两个步骤进行实时通知:-

1) 首先,用户通过客户端页面连接到套接字,然后是 emit 连接事件,由我们的 nodejs 服务器文件处理。

2) 在检测到用户已连接到套接字后,我在 nodejs 生成的服务器文件中执行了一些 mysql 提取,例如:-

// ....all module are presented here above...

io.sockets.on('connection', function(client) 
  var pool = mysql.createPool(
    connectionLimit: 10,
    host: "localhost",
    user: "root",
    password: "",
    database: "mydatabase"
  );

  pool.getConnection(function(err, connection) 
    var queryString = "Select * from table_one";
    connection.query(queryString, function(error, results) 
      if (error) 
        throw error;
       else 
        console.log("New client !");
        io.sockets.emit('u_d', results);
      
    );
    connection.release();
  );
);

在上面我使用了nodejs mysql 模块。它从table_onejson 数据类型上获取所有数据,如下图所示。

您可以看到我在json 类型上获取了我的数据。是否可以让我的json 数据以这样的正确格式获取:-


  "result": [
      "id": "2",
      "user": "hari061",
      "pic": "img.jpg"
    ,
    
      "id": "3",
      "user": "ram061",
      "pic": "nature.jpg"
    
  ]

该 json 数据将在这里交给我的客户端:-

var socket = io.connect('http://localhost:3000');

socket.on('u_d', function(data) 
  $('.display_noti').append($('<li style="margin-bottom:10px;margin-left:10px; margin-right:10px;">').text(data));
);

毕竟我发现了两个问题:-

1)在用户mysql 的每个连接中获取数据。(这意味着我的用户每次都应该连接一个套接字以进行新的更新)。这不是实时的,我的意思是页面重新加载只能使该用户连接到一个套接字然后只有它会显示他/她的新更新。

2) 我发现mysql 获取的数据是以json 格式检索的。我想控制适合我客户端的json 格式的结果。

我该如何解决这两个问题?

【问题讨论】:

【参考方案1】:

如果您在服务器外部修改数据,您可以添加一些 RESTful API 来触发服务器更新数据:

# example with express.js
app.put '/newdata/', (req, res) ->
    get_updated_data (result) ->
        io.sockets.emit 'u_d', result       # send new update to all connected clients

按照这个逻辑,当用户连接时,您应该将数据的“最后状态”发送到新客户端:

io.sockets.on 'connection', (client) ->
    get_last_state (result) ->
        client.emit 'last state', result    # send last state to new client

简单的 JSON 格式在一行中:

JSON.stringify jsonObject, null, '\t'

和here你可以阅读更多如何美化JSON字符串。

此外,如果您在 io 的 connection 之外对 MySQL 进行连接调用,您将在每次客户端连接到套接字时节省 MySQL 连接/断开连接的资源。

【讨论】:

我很困惑如何让用户实时显示通知更新?我的意思是我已经从数据库中获取数据并将其交给客户端,但它只工作一次。服务器和客户端应该如何代码工作实现实时功能? 如果您有权访问更改数据的代码,那么您必须在那里发出请求调用(在 npm 中参见 request),让服务器知道您的数据已更改。然后您执行您需要的操作并将有关更新的信息发送到所有连接的客户端。在某些情况下,以一定的间隔获取表就足够了,与之前的获取结果进行比较并发送更改。但这在很多方面都是一个糟糕的选择。 我想要这样的逻辑兄弟我首先想从表中获取一些数据并将这些数据发送回客户端。然后我想如果该表上发生任何新更改,它会立即再次发出客户端,以便用户实时获得新的更新。有没有办法去那个兄弟? 简短回答——是的。您是在服务器上还是在服务器外修改表数据? 因为在连接时获取数据会立即为您提供数据。之后,您必须以某种方式知道有更新可以将其发送给客户端。

以上是关于如何创建从 nodejs mysql 模块获取的正确 json 类型数据?的主要内容,如果未能解决你的问题,请参考以下文章