【问题标题】:Insert data in mongodb using Socket.io使用 Socket.io 在 mongodb 中插入数据
【发布时间】: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();
	});
});

【问题讨论】:

    标签: node.js mongodb socket.io


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 2021-02-13
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多