2016-05-27 18 views
3

Ich bin Entwickler einfache Chat-Anwendung, und ich möchte Nachrichten in MongoDb speichern. aber ich bekomme Fehler, wenn ich diesen Code ausführen. kann die Eigenschaft '_id' von undefined nicht lesen. Ich habe bereits einen Sammelanruf-Chat erstellt.Fügen Sie Daten in mongodb mit 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 }); 
 
});

Antwort

2

Es ist, weil Sie eine Zeichenfolgedata, um Ihre insertData Funktion sind vorbei (die Beurteilung durch den Code, ich denke, Sie sind der Annahme, dass data tatsächlich ein Objekt ist).

Dann gibst du data.msg, was offensichtlich ist undefined, als erstes Argument der save Methoden, die Sie ein gültiges Objekt hier bieten erwartet.

Bitte beachten Sie auch, dass Sie die Methode save für ein neu erstelltes Dokument verwenden, anstatt insertOne zu verwenden. Wie Sie in der api documentation sehen können, ist die Verwendung save jetzt veraltet. (Ich nehme an, Sie verwenden die letzte Version, die derzeit 2.1 ist)

+0

ya ich langsam den Fehler Dank #schankam –

Verwandte Themen