【问题标题】:Socket io, mssql, node, expressjs in localhost cannot append data to clientlocalhost 中的 Socket io、mssql、node、expressjs 无法将数据附加到客户端
【发布时间】:2019-09-15 12:14:50
【问题描述】:

我有非常大的数据要使用节点从 sql 服务器获取,并使用套接字 io 将数据实时广播到客户端。 我可以获取数据,但客户端无法更新 UI。

数据可以在浏览器中进行控制台登录。为什么数据没有附加到 html 正文中。

服务器正在本地运行。 使用最新稳定版本的 node 、 express 和 socket io @ 1.7.4 server.js

var fs = require("fs");
//const fse = require("fs-extra");
var compression = require('compression')
var Connection = require("tedious").Connection;
var Request = require("tedious").Request;
var path = require("path");
var TYPES = require("tedious").TYPES;
var sql = require("mssql"); 
var cors = require("cors");



var express = require("express"),
  app = express(),

  server = require("http").createServer(app);
  var io = require('socket.io')(server);
server.listen(3001, "0.0.0.0");

app.use(cors());
app.use(compression())
var dbConfig = {
  user: "xxx",
  password: "xxx",
  server: "xxx",
  database: "xxx"
};

//Connect to the Database Instance
var cp = new sql.ConnectionPool(dbConfig);
cp.connect(err => {
  console.log("Database error message +++++++++ " + err);
});

app.use(express.json());
io.on('connection', function(socket){
  socket.on('echo',function (data) {
    console.log(data);
  })
  var request = new sql.Request(cp);
  var statement =
"USE xxx; SELECT TOP 100000 * from xxxx";
request.stream = true;
request.query(statement);

request.on('recordset', columns => {
// Emitted once for each recordset in a query

})

request.on('row', row => {

  socket.emit("row",row);

})

request.on('error', err => {

})
request.on('done', result => {


})
});

索引.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Example</title>
</head>
<body>
         <script
        src="https://code.jquery.com/jquery-3.4.1.slim.js"
        integrity="sha256-BTlTdQO9/fascB1drekrDVkaKd9PkwBymMlHOiG+qLI="
        crossorigin="anonymous"></script>
        <script src="http://localhost:3001/socket.io/socket.io.js"> </script>
        <script>
            var socket = io.connect("http://localhost:3001",{
                transports: ['websocket','polling']
            });
            var body = $("body");
            socket.on("connect",function () {

            })
            socket.emit('echo', 'this is a message');   
            socket.on("row",function (data) {
                console.log(data);
                 body.append(data);
                })


        </script>

</body>
</html>

【问题讨论】:

    标签: javascript node.js sql-server express socket.io


    【解决方案1】:

    首先你使用的是express,所以不需要显式地使用http。 希望这可能有助于解决您的问题

    const express = require('express');
    const socketIO = require('socket.io')
    
    const app = express();
    const port = 3001;
    let server = app.listen(port, () => { // Create server & Listen port 3001
      console.log(`App listening on port ${port}!`);
      let io = socketIO(app, { pingInterval: 10000, pingTimeout: 5000 }); // Create server with express app
      io.on('connect', (socket) => { // Once connection established, You got socket object use this for your future data transfer
        console.log('Socket connected');
        socket.on('echo', data => {
          console.log('echo data')
        )
        socket.emit('row', {any: "any row data"})
      })
    });
    

    用户界面: 在 html 中你可以添加 ul 来追加你的数据

    <body>
       <ul id="container">
       </ul>
      // your scripts..
      socket.on("row", (data) => {
        $('#container').append(`<li> ${data} </li>`)
      });
    </body>
    

    【讨论】:

    • 我还是无法显示数据。
    • @Karan 它正在工作。我自己已经设置了本地环境并进行了测试
    • 你试过我获取的方式吗,我设置了request.stream =true,所以从表中获取行并作为流传递给客户端。
    • 不,那么您在 UI 中收到的内容(例如 socket.on("row", (data) => {console.log(data)}); )。
    • UI 中不显示数据,如果我不设置 request.stream = true,我必须等待大约 2-3 分钟,我无法实时更新 UI。在控制台中,我实时获得 10,000 个对象,没有任何延迟,我想我必须使用网络工作者。
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2017-08-07
    • 2021-09-14
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2013-06-29
    • 2015-11-21
    相关资源
    最近更新 更多