socketio express配置

1、安裝
	cnpm install socket.io --save
	
2、服務器端配置
	(1)在express創建好應用後
		var server = require('http').Server(app);
		
	(2)得到io對象
		var io = require('socket.io')(server);
	
	(3)通過io對象,監聽客戶端連接,執行回調
		io.on('connection', function (socket) {
				socket.on('監聽客戶端發送消息名稱',function(data爲接收的參數){...})
				socket.emit('發送給客戶端的消息名稱',參數) 只有一個客戶端能收到消息
				io.emit('發送給客戶端的消息名稱',參數)   所有該名稱的客戶端都能收到消息
	    })
			
	(4)將之前的app.listen監聽換成server.listen監聽
		server.listen(4000,function(){
	   	 console.log('this express server is running at http://127.0.0.1:4000 ');
		});
		
3、客戶端配置
	(1)引入io對象
		import io from 'socket.io-client'
		
	(2)連接服務器
		const socket = io('ws://localhost:4000')
		
	(3)監聽向服務器的發送和來自服務器的接收
		socket.on('服務器的發送消息名稱',function(data爲接收參數){...})
		socket.emit('發送給服務器的消息名稱',參數)

4、將客戶端運行
	將客戶端文件引入項目要執行一次的文件即可,如主入口文件index.js等

代碼示例:
express:

let express = require('express')
var bodyParser = require('body-parser');
var md5=require('blueimp-md5');
var cookieParser = require('cookie-parser');

var urlencodedParser = bodyParser.urlencoded({ extended: false });

const {UserModel} =require('./db/models');
const filter={password:0,__v:0};

var app=express();

//socket.io
var server = require('http').Server(app);
require('./socketio/test')(server);

server.listen(4000,function(){
    console.log('this express server is running at http://127.0.0.1:4000 ');
});

app.use(cookieParser());

// app.listen(4000,function(){
//     console.log('this express server is running at http://127.0.0.1:4000 ');
// })

app.get('/',function(req,res){
    res.send('aa');
})

//註冊路由
app.post('/register',urlencodedParser,function(req,res){
    const {username,password,type}=req.body;
    console.log(username,password,type)
    UserModel.findOne({username},function(err,doc){
        if(doc)
        {
            //有用戶,返回錯誤信息
            res.send({code:1,msg:'此用戶已存在'})
        }else{
            //無用戶,則保存
            new UserModel({username,password:md5(password),type}).save(function(err,doc){

            //生成cookie,用來持久化登錄
            res.cookie('userid',doc._id,{maxAge:1000*60*60*24})
            const data={username,type,_id:doc._id}
            res.send({code:0,data})
          })
        }
    })
})

//登錄路由
app.post('/login',urlencodedParser,function(req,res){
    const{username,password} =req.body

    UserModel.findOne({username,password:md5(password)},filter,function(err,user){
        if(user)
        {
            //生成cookie,用來持久化登錄
            res.cookie('userid',user._id,{maxAge:1000*60*60*24});
            console.log('yes');
            res.send({code:0,data:{user}})

        }else{
            res.send({code:1,msg:'用戶名或密碼不正確'});
        }
    })

})
let userd=''
//更新用戶信息路由(用戶信息完善,選擇頭像薪資等)
app.post('/update',urlencodedParser,function(req,res){

    //將cookie中存放的_id拿出來
    const userid = req.cookies.userid
    userd=req.cookies.userid;
    console.log(userd)
    if(!userid) //cookie中無id
    {
        res.send({code:1,msg:'請先登錄'});
    }else{
        const user=req.body;
        UserModel.findByIdAndUpdate({_id:userid},user,function(err,old){
            if(!old)
            {
                //無數據刪除cookie
                // res.clearCookie('userid');

                res.send({code:1,msg:'請先登錄'})
            }else{
                const {id,username,type}=old
                const data=Object.assign(user,{id,username,type})
                res.send({code:0,data})
            }
        })
    }

})

//根據cookie中的userid獲取用戶信息

app.get('/user',urlencodedParser,function(req,res){
       //將cookie中存放的_id拿出來
        const userid = req.cookies.userid
       if(!userid)
       {
           return res.send({code:1,msg:'請先登錄'})
       }
       UserModel.findOne({_id:userid},filter,function(err,user){
           res.send({code:0,data:user})
       })
})

//獲取用戶列表(根據類型)
app.get('/userlist',function(req,res){
    const {type}=req.query;
    UserModel.find({type},filter,function(err,users){
        res.send({code:0,data:users})
    })
})


socketio/test:

module.exports = function (server) {
    // 得到 IO 對象
    const io = require('socket.io')(server)

    //監視連接(當有一個客戶連接上時回調)
    io.on('connection', function (socket) {
        console.log('soketio connected')

        // 綁定 sendMsg 監聽, 接收客戶端發送的消息
        socket.on('sendMsg', function (data) {

            console.log('服務器接收到瀏覽器的消息', data)
            //向客戶端發送消息(名稱, 數據)
            socket.emit('receiveMsg', data.name + '_' + data.date+'哈哈')
            console.log('服務器向瀏覽器發送消息', data)
        })
    })
}

客戶端:

import io from 'socket.io-client'

// 連接服務器, 得到代表連接的 socket 對象
const socket = io('ws://localhost:4000')
// 綁定'receiveMessage'的監聽, 來接收服務器發送的消息
socket.on('receiveMsg', function (data) {
console.log('瀏覽器端接收到消息:', data)
})
// 向服務器發送消息
socket.emit('sendMsg', {name: 'Tom', date: Date.now()})
console.log('瀏覽器端向服務器發送消息:', {name: 'Tom', date: Date.now()})

index.js主入口文件:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './containers/App';
import * as serviceWorker from './serviceWorker';
import {HashRouter,Route,Switch,Redirect} from 'react-router-dom';

import Register from './containers/register/register';
import Main from './containers/main/main';
import Login from './containers/login/login';

import {Provider} from 'react-redux'
import store from './redux/store'

//引入socket.io客戶端文件
import './test/socketio'

ReactDOM.render(
  <Provider store={store}>
    <HashRouter>
      <Switch>
        <Route path='/register' component={(props) => <Register { ...props } />}></Route>  
        <Route path='/login' component={(props) => <Login { ...props } />}></Route>   
        <Route path='/' component={(props) => <Main { ...props } />}></Route>
        {/* <Redirect to='/register'></Redirect>     */}
      </Switch> 
    </HashRouter>
  </Provider>
  ,
  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章