我在这里看到过类似的问题,但没有一个完全像这样,所以我希望我不是在重复已经问过的问题。
我对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文件中,然后收工。
请指教。
@Murat的一个mysql连接/响应的链接绝对有帮助,并把我带到了正确的道路上。这是另一个问题的链接。
stackoverflow.com/a/67722081/13772090
然而,最终我最终使用第三方服务选择了 Pub/Sub 路线,这对我来说比尝试构建自己的基础设施要好得多。如果有人好奇,我和 Able 一起去了。
谢谢大家!
在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在这里