You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Socket.io连接MongoDB:Express前端数据通过Socket提交至MongoDB的疑问

使用 Socket.io + Express + MongoDB 实现前端数据提交

步骤1:先安装必要依赖

首先确保你把需要的包都装好,在项目根目录运行:

npm install express socket.io mongoose

步骤2:配置后端(app.js)

我给你写了完整的后端代码,包含Express启动、MongoDB连接、Socket.io配置,还有接收前端数据并存库的逻辑:

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const mongoose = require('mongoose');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 连接你的MongoDB数据库,记得把your-db-name改成你实际的库名
mongoose.connect('mongodb://localhost:27017/your-db-name', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('MongoDB连接成功'))
.catch(err => console.error('MongoDB连接失败:', err));

// 定义Playlist集合的模型,对应你说的youtube_id和upvotes字段
const playlistSchema = new mongoose.Schema({
  youtube_id: { type: String, required: true },
  upvotes: { type: Number, default: 0 }
});

const Playlist = mongoose.model('Playlist', playlistSchema);

// 托管前端静态文件,你的index.html要放在public文件夹里
app.use(express.static(__dirname + '/public'));

// 处理Socket.io客户端连接
io.on('connection', (socket) => {
  console.log('新用户连接:', socket.id);

  // 监听前端发来的"添加视频"事件
  socket.on('add-video', async (data) => {
    try {
      // 先检查数据库里有没有相同youtube_id的记录
      let video = await Playlist.findOne({ youtube_id: data.youtube_id });
      if (video) {
        // 如果存在就更新点赞数(你可以根据需求改成其他逻辑)
        video.upvotes += 1;
        await video.save();
        io.emit('video-updated', video); // 通知所有客户端数据更新了
      } else {
        // 不存在就创建新记录
        video = new Playlist({
          youtube_id: data.youtube_id,
          upvotes: data.upvotes || 0
        });
        await video.save();
        io.emit('video-added', video); // 通知所有客户端新视频添加成功
      }
    } catch (err) {
      console.error('存数据出错:', err);
      socket.emit('error', '保存失败,请重试');
    }
  });

  // 处理客户端断开连接
  socket.on('disconnect', () => {
    console.log('用户断开连接:', socket.id);
  });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
  console.log(`服务器跑在端口 ${PORT} 啦`);
});

步骤3:前端页面(index.html,放在项目的public文件夹下)

前端要引入Socket.io的客户端库,然后写发送数据的逻辑:

<!DOCTYPE html>
<html>
<head>
  <title>播放列表管理器</title>
</head>
<body>
  <h1>添加视频到播放列表</h1>
  <input type="text" id="youtubeId" placeholder="输入YouTube视频ID">
  <button onclick="addVideo()">添加视频</button>

  <!-- 自动加载Socket.io客户端库,不用自己下载 -->
  <script src="/socket.io/socket.io.js"></script>
  <script>
    // 和后端建立Socket连接
    const socket = io();

    function addVideo() {
      const youtubeId = document.getElementById('youtubeId').value.trim();
      if (!youtubeId) {
        alert('请输入有效的YouTube ID哦');
        return;
      }

      // 把数据发给后端
      socket.emit('add-video', {
        youtube_id: youtubeId,
        upvotes: 0 // 初始点赞数设为0,你可以根据需求改
      });

      // 监听后端的成功反馈
      socket.on('video-added', (video) => {
        alert(`视频添加成功!ID: ${video.youtube_id}, 当前点赞数: ${video.upvotes}`);
        document.getElementById('youtubeId').value = '';
      });

      socket.on('video-updated', (video) => {
        alert(`视频点赞数更新啦!ID: ${video.youtube_id}, 当前点赞数: ${video.upvotes}`);
        document.getElementById('youtubeId').value = '';
      });

      // 监听错误提示
      socket.on('error', (msg) => {
        alert(msg);
      });
    }
  </script>
</body>
</html>

关键逻辑说明

  • Socket连接:后端通过io.on('connection')监听客户端连接,前端用const socket = io()直接建立连接,不用手动写IP端口。
  • 数据传输:前端用socket.emit('事件名', 数据)发消息,后端用socket.on('事件名', 处理函数)收消息,实时性拉满。
  • MongoDB操作:用Mongoose定义模型,findOne查重复,save做新增或更新,Promise+async/await处理异步操作更清晰。
  • 实时通知:后端处理完数据后,用io.emit()给所有连接的客户端发通知,实现多端同步更新。

测试步骤

  1. 先确保本地MongoDB服务在运行(默认端口27017)。
  2. 按上面的结构建好文件,安装依赖后启动服务器:node app.js。
  3. 打开浏览器访问http://localhost:3000,输入YouTube ID点击添加,去MongoDB里看看your-db-name库的playlists集合,数据应该已经存进去了。

内容的提问来源于stack exchange,提问作者kyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:36:30