2016-05-27 6 views
3

Я разрабатываю приложение для простого чата, и я хочу хранить сообщения в mongoDb. , но я получаю ошибку, когда запускаю этот код. не может прочитать свойство «_id» неопределенного. Я уже создаю один чат для вызова коллекций.Вставьте данные в mongodb с помощью Socket.io

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

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

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

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

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

 

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

 

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

 

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

 
\t function updatenicknames(){ 
 
\t \t \t io.sockets.emit('usernames', Object.keys(users)); 
 
\t } 
 

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

ответ

2

Это потому, что вы передаете строкуdata, к вашему insertData функции (судя по вашему коду, я думаю, вы предположить, что data на самом деле является объект).

Тогда вы даете data.msg, что, очевидно, undefined, в качестве первого аргумента из save методов, который ожидает Вас предоставить действительный объект здесь.

Также обратите внимание, что вы используете метод save только что созданного документа, вместо insertOne.

Как вы можете видеть в api documentation, использование save теперь устарело. (Я думаю, вы используете последнюю версию, которая в настоящее время 2.1)

+0

ya i замедляет ошибку благодаря #schankam –