首页 > 解决方案 > 如何构建 NodeJs 代码

问题描述

我是 NodeJ 的新手。我创建了一个简单的应用程序,使用socket.io. 我知道我可以使用框架,但我对和sExpressJs没有全面了解,因此调试和维护很容易。how to separate the codedivide them into multiple page

一般来说,我不明白how to structure the code在哪里编写 socket.io 代码或任何其他 NodeJs 代码。

我应该创建新的文件夹和文件吗?如果是,那怎么办?

我的代码:app.js

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var ent = require('ent');
var fs = require('fs');

var cntActiveProductSupport = 0;
var cntActiveCustomer = 0;
var support_socket_id = '';

app.get('/',function (req, res) {
    res.sendFile(__dirname+'/index.html');
});

app.get('/product_support',function (req, res) {
    res.sendFile(__dirname+'/admin.html');
});

io.sockets.on('connection',function(socket,username){
    //Each Socket in Socket.IO is identified by a random, unguessable, unique identifier Socket#id
    console.log(socket.id);
    //total number of connections
    console.log(io.engine.clientsCount);

    socket.on('support_connected',function(username){
        username = ent.encode(username);
        socket.username = username;
        socket.broadcast.emit('support_connected',username);
        //get socket id of all connected sockets
        Object.keys(io.sockets.sockets).forEach(function(id) {
            console.log("ID:",id)  // socketId
        });

        cntActiveProductSupport++;
        support_socket_id = socket.id;
    });

    socket.on('new_client',function(username){
        var client_socket_id = socket.id;
        username = ent.encode(username);
        socket.username = username;
        socket.broadcast.emit('new_client',{ username: username, socket_id: socket.id, support_socket_id: support_socket_id });
        socket.to(client_socket_id).emit('client_connected',{ username: username, support_socket_id: support_socket_id });

        cntActiveCustomer++;
    });

    socket.on('message',function(data){
        //socket.disconnect(true); use this if you want to disconnect client from server
        //client which sent the message
        var client_socket_id = socket.id;
        var message = ent.encode(data.message);
        // sending to individual socketid (private message)
        //socket.to(socketId).emit('hey', 'I just met you');
        socket.to(support_socket_id).emit('message', {username: socket.username,message:message, client_socket_id: client_socket_id});
    });

    socket.on('support_messaging',function(data){
        message = ent.encode(data.message);
        var customer_socket_id = data.customer_socket_id;
        //socket.broadcast.emit('message', {username: socket.username,message:message});
        // sending to individual socketid (private message)
        socket.broadcast.to(customer_socket_id).emit('message', {username: socket.username,message:message});
        //socket.to(socketId).emit('hey', 'I just met you');
        //It's the same command as for rooms, that's because:
        //"For your convenience, each socket automatically joins a room identified by this id."
    });

    socket.on('typing',function(username){
        socket.broadcast.emit('typing', username);
    });

    socket.on('stopped-typing',function(){
        socket.broadcast.emit('stopped-typing');
    });
});

server.listen(8080);

我的代码:index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Real-time Super Chat!</title>
    <style>
        #zone_chat strong {
            color: white;
            background-color: black;
            padding: 2px;
        }

        #writeup {
            font-size:9px;
            color: gray;
            margin: 5px 0px;
        }
    </style>
</head>

<body>
<h4>Real-time Super Chat!</h4>

<form action="/" method="post" id="chat_form" autocomplete="off">
    <input type="text" name="message" id="message" placeholder="Your message..." size="50" />
    <input type="submit" id="send_message" value="Send" />
    <input type="hidden" id="support_socket_id" value=""/>
    <div id="writeup"></div>
</form>

<section id="chat_zone">

</section>


<script
        src="https://code.jquery.com/jquery-3.3.1.js"
        integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
        crossorigin="anonymous"></script>
<script src="/socket.io/socket.io.js"></script>
<script>

    // Connecting to socket.io
    var socket = io.connect('http://localhost:8080');
    var socketConnected = false;

    // The username is requested, sent to the server and displayed in the title
    var username = prompt('What\'s your username?');
    //var username = 'Deepak';
    socket.emit('new_client', username);
    document.title = username + ' - ' + document.title;

    socket.on('connect', function() {
        socketConnected = true;
        console.log('Connected! ID: ' + socket.id);
    });

    socket.on('client_connected', function(data){
        $('#support_socket_id').val(data.support_socket_id);
    });

    socket.on('disconnect', function() {
        socketConnected = false;
        console.log('Disconnected!');
    });

    // When a message is received it's inserted in the page
    socket.on('message', function(data) {
        insertMessage(data.username, data.message)
    });

    // When a new client connects, the information is displayed
    // socket.on('new_client', function(username) {
    //     $('#chat_zone').prepend('<p><em>' + username + ' has joined the chat!</em></p>');
    // });

    socket.on('typing',function(username){
        $('#writeup').html(username + ' is typing...');
    });

    socket.on('stopped-typing',function(){
        $('#writeup').html('');
    });

    $(document).ready(function () {
        $('#message').on('focus',function(){
            socket.emit('typing',username);
        });

        $('#message').on('blur',function(){
            socket.emit('stopped-typing',username);
        });

        // When the form is sent, the message is sent and displayed on the page
        $('#chat_form').submit(function () {
            var message = $('#message').val();
            var support_socket_id = $('#support_socket_id').val();
            socket.emit('message', { message:message, support_socket_id:support_socket_id }); // Sends the message to the others
            insertMessage(username, message); // Also displays the message on our page
            $('#message').val('').focus(); // Empties the chat form and puts the focus back on it
            return false; // Blocks 'classic' sending of the form

        });
    });

    // Adds a message to the page
    function insertMessage(username, message) {
        $('#chat_zone').prepend('<p><strong>' + username + '</strong> ' + message + '</p>');
    }
</script>
</body>
</html>

标签: node.jssocketsexpresssocket.io

解决方案


您应该创建节点模块以维护代码结构。例如创建路由文件夹并将所有路由放在其中并将它们分开,就像 users.js 是一个路由文件来满足与用户相关的路由。当您使用 socket.io 时,您可以为 socket.io 函数创建一个单独的模块并在您的路由中使用它们。

此链接可能会对您有所帮助:https ://nodejs.org/api/modules.html

我希望它有所帮助。

应用结构:路由, 在此处输入图像描述


推荐阅读