使用 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 时,“更改”被多次触发