mongose链接数据库与批插入

本文分享了使用MongoDB及Mongoose模块过程中遇到的问题及解决办法,包括如何正确管理数据库连接,以及如何利用Mongoose实现批插入功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据库链接

最近在写爬虫程序进行抓包,使用mongodb数据库的过程中遇到数据库链接的问题。

因为习惯了以前使用mysql时关闭数据库链接的习惯,不太了解Mongodb如何操作数据库链接。

加上我使用的是mongooes这个NPM模块进行数据库操作。

官方的示例是使用

var M = require('mongoose');
M.connect('mongodb://admin:411411411@kahana.mongohq.com:10043/blog');

类似这样的代码段

但是例如当我在User.js 和Diary.js中都加人对应代码,就发现会报数据库链接错误。

查阅资料后,在stackoverflow发现,mogoooes对应一个数据库只要进行一次链接,对应多个数据库才需要进行多次链接

最终的解决方案是新建一个db.js,导出数据库链接,每次需要就require这个模块

var M = require('mongoose');
M.connect('mongodb://admin:411411411@kahana.mongohq.com:10043/blog');
// reference to the database connection 为这个连接创建一个引用
var db = M.connection;
// expose to modules that require database.js 把这个引用暴露给引用 database 模块的其他模块
module.exports = db;
2.批插入

mongodb有个批插入的功能,使用mongooes后也想实现,最后查阅文档总算成功了

这里附一个完整的Model

/**
 * Created by Administrator on 14-8-8.
 */
var mongoose = require('mongoose');
var db = require('./db.js');
var gooditemSchema = new mongoose.Schema({
    iid:String,
    status: String,
    date: String,
    pv: String,
    url : String,
    name :String,
    owner :String

}, {
    collection: 'gooditems'
});

var GooditemModel = mongoose.model('Gooditem', gooditemSchema);

function Gooditem(gooditem) {
    this.iid=gooditem.iid;
    this.name = gooditem.name;
    this.pv =gooditem.pv;
    this.status = gooditem.status;
    this.url = gooditem.url;
    this.date = gooditem.date;
    this.owner = gooditem.owner;
};
//保存
Gooditem.prototype.save = function(callback) {
    var gooditem= {
        iid:this.iid,
        name:this.name,
        pv :this.pv,
        status : this.status,
        url : this.url,
        date : this.date,
        owner : this.owner
    };

var Model = new GooditemModel(gooditem);
     Model.save(function (err, gooditem) {
        if (err) {
            return callback(err);
        }
        callback(null, gooditem);

    });
};
//查
Gooditem.get = function(iid, callback) {
    gooditemModel.findOne({iid: iid}, function (err, gooditem) {
        if (err) {
            return callback(err);
        }
        callback(null, gooditem);
    });
};
//改
Gooditem.update = function(iid,img,callback){
    var conditions = {iid : iid};
    var update     = {$set : {img: img}};
    var options    = {upsert : true};
    gooditemModel.update(conditions, update, options, function(error,data){
        if(error) {
            console.log(error);
        } else {
            callback( 'update ok!');
        }
    });

}
//批插入
Gooditem.batch = function(array,callback){
    GooditemModel.create(array,function(err){
        if(err){
            callback('error')
        }
        else{
            callback("ok")
        }
    })

}
module.exports = Gooditem;



<think>好的,用户想知道如何在Mongoose(Node.js的ODM)和Node.js中创建WebSocket服务器端实现。首先,我需要回忆Mongoose和WebSocket的基本知识。Mongoose主要用于MongoDB的对象文档映射,而WebSocket是一种全双工通信协议,通常用于实时应用。用户可能希望将数据库操作实时通信结合起来,比如在数据更新时通知客户端。 接下来,我需要确定如何在Node.js中集成WebSocket。常用的库有ws和socket.io。ws是一个轻量级的WebSocket库,而socket.io提供了更多功能,比如自动重连和房间支持。用户可能更倾向于使用其中一个,但需要给出两种选项的建议。 然后,如何将WebSocket服务器现有的Express应用集成?通常,Express应用使用HTTP服务器,而WebSocket服务器需要监听同一个端口。使用ws库的话,可以将WebSocket服务器附加到现有的HTTP服务器实例上。对于socket.io,它可以直接Express应用结合,简化配置。 接下来要考虑Mongoose的集成。用户可能需要在数据库操作完成后触发WebSocket消息推送。例如,当保存一个文档到MongoDB后,通过WebSocket广播给所有连接的客户端。这里需要确保在Mongoose的模型事件或中间件中触发WebSocket的发送方法。 需要提醒用户注意资源的释放,比如在服务器关闭时关闭WebSocket连接。此外,处理跨域问题,可能需要配置CORS,尤其是当客户端和服务器不在同一域时。安全方面,可能需要验证客户端的连接请求,比如检查JWT令牌。 最后,用户可能需要一个简单的例子来演示整个过程,包括安装依赖、设置服务器、处理连接和集成Mongoose。需要确保代码示例正确,并且注明不同库的使用方法,比如ws和socket.io的区别。同时,要提到性能优化和错误处理,比如使用Redis适配器横向扩展socket.io服务器。</think>在 Node.js 中集成 WebSocket 服务器端 Mongoose 的操作,可以通过以下步骤实现: --- ### 一、基础架构搭建 1. **安装依赖** ```bash npm install ws mongoose express # 使用原生 WebSocket 库 # 或 npm install socket.io mongoose express # 使用 Socket.IO ``` 2. **创建 HTTP 服务器** ```javascript const express = require('express'); const http = require('http'); const app = express(); const server = http.createServer(app); ``` --- ### 二、WebSocket 服务器实现(两种方案) #### 方案1:使用原生 `ws` 库 ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { ws.on('message', (message) => { console.log('收到消息:', message); ws.send(`服务器回应: ${message}`); }); }); ``` #### 方案2:使用 `Socket.IO`(推荐) ```javascript const { Server } = require('socket.io'); const io = new Server(server); io.on('connection', (socket) => { console.log('客户端已连接'); socket.on('message', (data) => { io.emit('broadcast', `广播消息: ${data}`); // 广播给所有客户端 }); }); ``` --- ### 三、Mongoose 集成 1. **数据库连接** ```javascript const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/realtime-db') .then(() => console.log('MongoDB 连接成功')) .catch(err => console.error('连接失败:', err)); ``` 2. **数据变更时触发 WebSocket** ```javascript // 示例:当文档保存时推送通知 const MessageSchema = new mongoose.Schema({ content: String }); const Message = mongoose.model('Message', MessageSchema); Message.watch().on('change', (change) => { io.emit('db-change', change); // 实时推送数据库变更 }); ``` --- ### 四、完整代码示例 ```javascript const express = require('express'); const http = require('http'); const { Server } = require('socket.io'); const mongoose = require('mongoose'); // 初始化服务 const app = express(); const server = http.createServer(app); const io = new Server(server); // 连接 MongoDB mongoose.connect('mongodb://localhost:27017/realtime-db'); // WebSocket 事件处理 io.on('connection', (socket) => { socket.on('new-message', async (msg) => { const savedMsg = await Message.create({ content: msg }); // 保存到数据库 io.emit('message-added', savedMsg); // 广播新消息 }); }); // 启动服务器 server.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); }); ``` --- ### 五、关键注意事项 1. **跨域处理** 在 Socket.IO 中需配置 CORS: ```javascript const io = new Server(server, { cors: { origin: "http://your-client-domain.com" } }); ``` 2. **性能优化** - 使用 Redis 适配器实现多节点扩展[^1] - 使用 `socket.join(roomId)` 实现房间级消息推送 3. **错误处理** ```javascript socket.on('error', (err) => { console.error('WebSocket 错误:', err); }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值