使用 Socket.io 在 mongodb 中插入数据

Posted

技术标签:

【中文标题】使用 Socket.io 在 mongodb 中插入数据【英文标题】:Insert data in mongodb using Socket.io 【发布时间】:2016-09-25 08:46:16 【问题描述】:

我正在开发简单的聊天应用程序,我想将消息存储在 mongoDb 中。 但是当我运行此代码时出现错误。 无法读取未定义的属性“_id”。我已经创建了一个集合通话聊天。

var MongoClient= require('mongodb').MongoClient;
var assert=require('assert');
var ObjectId= require('mongodb').ObjectId;
var bodyParser= require('body-parser');	
var express = require('express'),
 	app=express();
 	server=require('http').createServer(app),
 	io= require('socket.io').listen(server),
 	app.use(bodyParser.urlencoded(extended:false));
 	var mongo=require('mongodb');
 	users = ;
 	url='mongodb://localhost:27017/anant';

server.listen(9000, function()
	var host= server.address().address;
	var port=server.address().port;

	console.log("save app listen on http://%s:%s", host , port);
);

/*var server = app.listen(9000, function()
	var host= server.address().address;
	var port=server.address().port;

	console.log("save app listen on http://%s:%s", host , port);
);*/


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


io.sockets.on('connection', function(socket)
	socket.on('new user', function(data , callback)
		if(data in users)
				callback(false);
		else
			callback(true);
			socket.nickname= data;
			users[socket.nickname]= socket;
			updatenicknames();
		
	);
	
	io.sockets.on('send request', function(data , callback)
			var name=data;
			console.log(data);
	);


	socket.on('send message', function(data , callback)
		var msg=data.trim();
		if(msg.substr(0,3) === '/w ')
				msg = msg.substr(3);
				var	 ind = msg.indexOf(' ');
				console.log(ind);
				console.log("got it after ind ");
				if(ind !== -1)
				
					var  name=msg.substr(0, ind);
					var msg=msg.substring(ind + 1);
					console.log(name);
					console.log(msg);
					if(name in users)
						console.log("got it in if name condition");
						users[name].emit('wishper', msg: msg , nick: socket.nickname );
					console.log('whisper..!	');
					 else
					
						callback("enter a vlid user");
					
				 else
						callback('please enter message for your wishper');
				
		else 
		insertData(data);
		io.sockets.emit('new message', msg: msg , nick: socket.nickname );
			
	);	

	function updatenicknames()
			io.sockets.emit('usernames', Object.keys(users));
	

	function insertData(data)
		
	
			MongoClient.connect(url, function(err, db)
			console.log(data);
			db.collection('chat').save(data.msg , (err,result)=>
				if(err)
					console.log("not inserted");
				else 
					console.log("inserted");
				
			);
		);
		
	
	socket.on('disconnect', function(data)
		if(!socket.nickname) return;
		delete users[socket.nickname];
		updatenicknames();
	);
);

【问题讨论】:

【参考方案1】:

这是因为您将 string data 传递给您的 insertData 函数(根据您的代码,我猜您假设 data 实际上是一个 object)。

那么你给data.msg,显然是undefined,作为save方法的第一个参数,它期望你在这里提供一个有效的对象

还请注意,您在新创建的文档上使用save 方法,而不是使用insertOne

正如您在api documentation 中看到的,现在不推荐使用save。 (我猜你使用的是当前 2.1 的最新版本)

【讨论】:

以上是关于使用 Socket.io 在 mongodb 中插入数据的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中使用带有 Socket.io 的 Change Stream 时,“更改”被多次触发

MongoDB 更改流与 socket.io

socket.io 和按对象 id 过滤 mongodb

socket.io 和按对象 id 过滤 mongodb

Socket.io - React:如何在 React 中检索保存的 socket.io 数据(MongoDB)?

使用socket.io + express + mongodb制作在线聊天室