当前位置: 首页 > 知识库问答 >
问题:

在node.js中共享客户端和服务器js文件之间的mysql连接

百里沛
2023-03-14

我在这里看到过类似的问题,但没有一个完全像这样,所以我希望我不是在重复已经问过的问题。

我对node.js很陌生

我被困在尝试将代码分成“模块”的步骤。我的项目目录结构如下。

我的index.js启动快速服务器并设置基本的socket.io连接。据我所知,这个起点index.js文件是“服务器端”js。

索引. js

const path = require('path')
const http = require('http')
const express = require('express')
const socketio = require('socket.io')
const { generatemsg } = require('./utils/messages')
const { addUser, removeUser, getUser, getUserInRoom } = require('./utils/users')
const pool = require('./utils/dbconfig');
const db = require('../public/js/database');

const app = express()
const server = http.createServer(app)
const io = socketio(server)
const PORT = process.env.PORT || 3000

const publicdir = path.join(__dirname, '../public')

app.use(express.static(publicdir))

io.on("connection", (socket) => {
    console.log("new connection from socket.io")

    socket.on("join", ({ username, room }, cb) => {

        const { error, user } = addUser({ id: socket.id, username, room })

        if (error) {
            return cb(error)
        }
        
        socket.join(user.room)

        //generate random color
        const colorsArray = ["red", "green", "lime", "purple", "blue"]
        var arrayPos = Math.floor(Math.random() * colorsArray.length)
        var colorTmp = colorsArray[arrayPos]

        //Add New User to DB
        var userTmp = user.username
        var roomTmp = user.room
        
        db.addCurrentUserToDB(userTmp, roomTmp, colorTmp)

        io.to(user.room).emit("roomData", {
            room: user.room,
            users: getUserInRoom(user.room)
        })
        
        cb()
    })

    socket.on("sendMessage", (msg, cb) => {
        const user = getUser(socket.id)
        io.to(user.room).emit("message", generatemsg(user.username, msg))
        cb()
    })

    socket.on("disconnect", () => {
        const user = removeUser(socket.id)
        console.log(user)
        if (user) {
            io.to(user.room).emit("message", generatemsg(`${user.username} left.`))

            io.to(user.room).emit("roomData", {
                room: user.room,
                users: getUserInRoom(user.room)
            })
        }
    })
})


server.listen(PORT, () => {
    console.log("server is up at port: " + PORT)
})

因此.js,我对事物何时从服务器端转移到客户端的理解.js在这里开始变得奇怪。索引.js是服务器端的.js因为我能够使用一些变量 = require('某个模块');

然后在我的utils目录中是我的数据库配置文件。为了共享mysql连接,我相信我需要创建一个池连接,这就是我在这里尝试做的事情。

数据库配置. js

const mysql = require('mysql');

const pool  = mysql.createPool({
    connectionLimit : 100,
    host: "xxxx",
    port: 3306,
    user: "xxxx",
    password: "xxxx",
    database: 'xxxx',
    multipleStatements: true
});

pool.getConnection(function(err, connection) {
    if (err) throw err; // not connected!
    
    console.log('Connected from dbconfig.js');
});

module.exports.pool = pool;

由于我不完全理解的原因,utils文件夹中的文件似乎仍然是服务器端js,这就是为什么我能够将它们包含在索引中的原因。js文件,并使用数据库中的函数。js文件(客户端)。

在公共/js文件夹中,我存储了我将在整个应用程序中随机调用的所有数据库函数。

Database.js(为简洁而缩写)

    //Add New User
    function addCurrentUserToDB(userTmp, roomTmp, colorTmp) {
    var sql = 'INSERT INTO pzs_info (username, roomname, usercolor) VALUES (?, ?, ?)';

    pool.getConnection(function(err, connection) {
        if (err) throw err; // not connected!
      
        // Use the connection
        connection.query(sql, [userTmp, roomTmp, colorTmp], (err, result, fields) => {
            if (err) throw err;
        
            console.log('Added user' + userTmp); //result.changedRows
            connection.release();
        });
    });
}

数据库。js文件现在看起来像是“客户端”js,因此似乎无法访问mysql连接(因为它存储在我猜是服务器端的.js文件中),即使我将其导出到dbconfig中。js文件。

根据我如何改变上面的代码,我会得到从池不是函数或池未定义的错误,在最新版本中,我一直在这样做:

数据库.js

const dbstuff = require('../../src/utils/dbconfig');

//Add New User
function addCurrentUserToDB(userTmp, roomTmp, colorTmp) {
    var sql = 'INSERT INTO pzs_info (username, roomname, usercolor) VALUES (?, ?, ?)';

    dbstuff.pool.query(sql, [userTmp, roomTmp, colorTmp], function (error, results, fields) {
        if (error) throw error;
        console.log('Added user' + userTmp); //result.changedRows
    });
}

我猜这是因为此时此刻,数据库。js文件现在是客户端。js,不能使用require函数。

但有趣的是,尽管它从console.log中的database.js文件中给了我不能使用require错误消息,但它实际上仍然将用户名/房间/颜色写入数据库。去想想。

我的猜测是,节点如何在客户端/服务器端之间共享功能的一些基本逻辑完全无法理解。

更新:好吧,我已经取得了一些进展,这要感谢这里添加esm模块的建议,这允许我将require与import语句混合/匹配。

所以我现在能够从dbconfig.js文件(dbconfig是服务器,数据库是客户端)中提取数据库中的连接.js文件,所以这很好。

然而,我一直在尝试获取数据库。js文件导入聊天。js文件(都是客户端)。

我尝试在chat.js文件的顶部添加一个导入语句

import { updateUserList } from './database.js';

然而,这会产生SyntaxError:导入声明只能出现在模块错误的顶层。

如果我也将type="module "添加到我的chat.html文件中,如下所示:

<script src="/js/chat.js" type="module"></script>

然后我得到了几个不同的错误。聊天时出现404错误。js文件,一个文件由于不允许的mime类型错误等而被阻止。

所以…我又开始旋转了。不知道为什么我不能把database.js文件包含在我的chat.html文件中,然后收工。

请指教。

共有2个答案

丌官霖
2023-03-14

@Murat的一个mysql连接/响应的链接绝对有帮助,并把我带到了正确的道路上。这是另一个问题的链接。

stackoverflow.com/a/67722081/13772090

然而,最终我最终使用第三方服务选择了 Pub/Sub 路线,这对我来说比尝试构建自己的基础设施要好得多。如果有人好奇,我和 Able 一起去了。

谢谢大家!

鲜于光赫
2023-03-14

在Database.js文件中,db的是您的池变量。请使用dbstuff.query而不是dbstuff.pool.query.

 类似资料:
  • 问题内容: 有什么方法可以在node.js的客户端和服务器之间共享数据(包括对象)?我曾经依赖于为此目的而设计的模块now.js,但是该项目已经停产了,我正在寻找替代品。现在now.js被放弃了,还有没有其他方法可以在客户端和服务器之间无缝同步变量? 问题答案: 在now.js之后,两个最接近的竞争者是shareJS和dnode: http://sharejs.org/ https://githu

  • 问题内容: 我用Node.js运行一个简单的http服务器: 我的index.html文件: 现在,我想在我的index.html文件中打印服务器端变量:temp。但是我不知道该怎么做。 也许有人可以帮助我从服务器到客户端交换变量。 问题答案: 正如您可以在@WebServer的答案中看到的那样,节点中有多种模板引擎。 我想给你一个使用其中一个的例子-EJS: 首先安装它: server.js:

  • 我的项目是在服务器上读取一个图像,进行一些处理,然后将整个图像传递给客户端。客户端接收图像并进行更多处理,然后将一些输出值返回给服务器。服务器和客户端之间使用的映像大小为[640x480x3]。 以下是我想到的实现这个问题的各种技术: 通过消息将整个像素值从服务器传递到客户端 在SO中有各种各样的答案。我目前正在努力让它工作。 服务器和客户端之间的这种消息传递模式是否可能?如果是,请提供一些文档参

  • 我正在使用ActiveMQ客户端库将我的服务器应用程序连接到ActiveMQ。几个不同的消费者和生产者在单个线程中运行。、和之间的关系应该如何? 每个JVM一个连接工厂 每个JVM一个到代理的连接或n个连接,每个使用者一个 n个会话,每个消费者一个(Javadoc似乎强烈建议这样做)

  • 问题内容: 我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序? 此文件传输应该在客户端和服务器之间,并且应该是“部分”。 StreamFileService.thrift: StreamFileClient.java: } StreamFileServer.java: } StreamFileServiceImpl: } 问题答案: 您的代码对我来说似乎还不错(未经测试),没

  • 问题内容: 我正在尝试在Java主机和android客户端之间设置双向身份验证SSL连接。不知道为什么它没有连接。以下是Android客户端应用和Java服务器的代码。 客户代码: 服务器代码: 我在服务器上遇到“没有共同的密码套件”错误。由于我不在SSL连接设置中。如果您发现错误或主要问题,请允许我提供帮助。 这是我用来创建证书和信任库的链接。我创建的Truststore和kestore在这里