首先创建数据库保存用户信息
数据库创建名 users 集合并插入条用户信息前没 users 集合mongodb 直接创建
>db.users.insert( { "userId":1, "name":"tom", "email":"tom@nodejs.org" })
查找信息使用 find 或者 findOne区别于 findOne 返结
db.users.findOne( {"userId": 1})
返结:
{
"_id" : ObjectId("5413be6e9e1c9f9c4386756d"),
"userId" : 1,
"name" : "tom",
"email" : "tom@nodejs.org"
}
驱程序
编辑 package.json, 添加于 mongodb 引用
{
"name": "express-api",
"version": "0.0.1",
"dependencies": {
"express": "2.5.9",
"ejs": "0.4.2",
"mongodb": "1.4.1"
}
}
重新 npm install 安装 mongodb 驱
使用 MongoDB 数据库
修改代码首先 require mongodb 模块连接 mongodb 数据库
var mongo = require("mongodb")
var express = require("express")
var app = express.createServer()
app.set("view engine", "ejs")
app.set("views", __dirname + "/views")
app.set("view options", { layout: false })
app.get("/", function (request, response) {
response.render("index")
})
app.get("/user/:id", function (request, response) {
var id = request.params.id
console.log(id)
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error)
response.json(doc)
})
})
// connect mongodb
var server = new mongo.Server("127.0.0.1", 27017)
var db = new mongo.Db("members", server, {safe:true }).open(function (error, client) {
if (error) throw error
console.log("\033[96m + \033[39m connected to mongodb")
app.users = new mongo.Collection(client, "users")
client.ensureIndex("users", "userId", function (error) {
if (error) throw error
console.log("\033[96m + \033[39m ensured index.")
console.log("Web Server listening ......")
app.listen(3000)
})
})
注意现数据库查找用户id 前面 + 用表单字符串类型数据转换需要数字类型
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error)
response.json(doc)
})
nodejs把数据存到mongodb里方法:首先,创建一个数据库保存用户信息。
在这个数据库中创建一个名为 users 的集合,并插入一条用户信息。当前没有 users 集合,mongodb 会直接创建它。
>db.users.insert( { "userId":1, "name":"tom", "email":"tom@nodejs.org" })
查找信息可以使用 find 或者 findOne,区别在于 findOne 只会返回一个结果。
db.users.findOne( {"userId": 1})
返回的结果:
{
"_id" : ObjectId("5413be6e9e1c9f9c4386756d"),
"userId" : 1,
"name" : "tom",
"email" : "tom@nodejs.org"
}
驱动程序
编辑 package.json, 添加对于 mongodb 的引用。
{
"name": "express-api",
"version": "0.0.1",
"dependencies": {
"express": "2.5.9",
"ejs": "0.4.2",
"mongodb": "1.4.1"
}
}
重新 npm install 安装 mongodb 的驱动。
使用 MongoDB 数据库
修改代码,首先 require mongodb 模块,然后连接到 mongodb 数据库。
var mongo = require("mongodb")
var express = require("express")
var app = express.createServer()
app.set("view engine", "ejs")
app.set("views", __dirname + "/views")
app.set("view options", { layout: false })
app.get("/", function (request, response) {
response.render("index")
})
app.get("/user/:id", function (request, response) {
var id = request.params.id
console.log(id)
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error)
response.json(doc)
})
})
// connect mongodb
var server = new mongo.Server("127.0.0.1", 27017)
var db = new mongo.Db("members", server, {safe:true }).open(function (error, client) {
if (error) throw error
console.log("\033[96m + \033[39m connected to mongodb")
app.users = new mongo.Collection(client, "users")
client.ensureIndex("users", "userId", function (error) {
if (error) throw error
console.log("\033[96m + \033[39m ensured index.")
console.log("Web Server listening ......")
app.listen(3000)
})
})
注意现在是到数据库中查找用户。id 前面的 + 用来将表单中的字符串类型数据转换为需要的数字类型。
app.users.findOne({ "userId": +id }, function (error, doc) {
if (error) return next(error)
response.json(doc)
})
先说下我对socket.io的理解,websocket更像是开启了一个端口服务,来监视过往的通讯。所以我们可以依赖于当前站点80端口启socket服务,也可以放于其他端口上,比如:1
require('socket.io').listen(3000)
这样就是监视3000端口了,由于我用的免费服务器,没有权限打开其他端口,所以,我还是使用80了,由于80已经被express使用了,所以我只好在express使用的时候传进来了。
var server = http.createServer(app)
var socket = require('./socket/msg')(server)
然后 我在msg.js里是这样写的
var db = require('../db/mysql')
var sio = require('socket.io')
var IO = function(server) {
var io = sio.listen(server)
这样就和谐了,db是创建mysql连接的方法,不在本节内容里,略。
在socket.io里是这样的,首先创建一个io通道的连接,然后监视里面的socket的事件,nodejs是事件驱动嘛。代码如下:
io.on('connection', function(socket) {
console.log('a user connected.')
socket.on('disconnect', function() {
console.log('user disconnected.')
})
})
这时只要有用户连接上,就会进入connection中了,然后它的参数是个socket,如果是公聊,我们可以直接用
1
io.emit('chat message', {})
这种形式了。但我们这里是私聊,所以我们要临时的把这个socket对象保存在全局里,供与你私聊的对象使用找到你的socket,很绕口,其实这里的私聊,不算完全的点对点,它还是经过了服务器的,消息传给服务器,服务器再找到你要传达给的那个人的socket对象,发给他。这就是整个的过程了。这里我使用的是一个类数组对象来存储的.
var users = {},
usocket = {}
socket.on('user join', function(data) {
users[username] = username
usocket[username] = socket
})
由于我这里需要用户名登录,所以我就把用户名作为了唯一的标识,这里用类数组的形式的好处就是我不用循环也能够很快的找到它。再我给A发送私聊时,我会先在这个uscoket里面找到它,然后调用它的emit。
function sendUserMsg(data) {
if (data.to in usocket) {
console.log('================')
console.log('to' + data.to, data)
usocket[data.to].emit('to' + data.to, data)
usocket[data.user].emit('to' + data.user, data)
console.log('================')
}
}
这里我emit了两次的原因是,我发给对方消息的同时,我自己也要收到这个消息,然后把它显示出来,为什么这样?其一,接口统一了,聊天里的内容全是服务器过来的,其二,证明我发送成功了。
然后我在客户端监听时,也用我自己的用户名起了一个to+用户名的事件监听。
socket.on('to' + user, function(data) {
//console.log(data)
formatMsg(data)
})
这样,不管是我发的消息,还是我收到消息,都会进入这个事件了。最后,在用户离开的时候别忘记delete掉这个对象。
socket.on('disconnect', function() {
console.log('disconnect')
if (username) {
counter--
delete users[username]
delete usocket[username]
if (home.name == username) {
homeLeave(username)
}
sendmsg({
type: 0,
msg: "用户<b>" + username + "</b>离开聊天室",
counter: counter,
users: users
})
}
})
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)