express结合Socket.io 跨域实现聊天以及Socket.io结合数据库实现智能机器人

app.js



var express=require('express');

var app=express();

var DB=require('./module/db.js');

/*第一步*/
var server = require('http').Server(app);
var io = require('socket.io')(server);


app.set('view engine','ejs');
app.use(express.static('public'));

app.get('/',function(req,res){
    //res.send('首页');
    res.render('index');
})


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

})

//2.监听端口
server.listen(8000,'192.168.0.3');   /*改ip*/


//3、写socket的代码

io.on('connection', function (socket) {
    console.log('建立链接')

    socket.on('message',function(data){

        console.log(data)
        //socket.emit('servermessage',msg);

        var msg=data.msg||'';  /*获取客户端的数据*/

        //去服务器查询数据

        DB.find('article',{'title':{$regex:new RegExp(msg)}},{'title':1},function(err,data){

            console.log(data);


            socket.emit('servermessage',{
                result:data
            });
        })


    })
});

config.js

var dbUrl = 'mongodb://localhost:27017/koa';


module.exports={

    dbUrl:dbUrl
}

db.js

//封装操作数据库的方法


var config=require('./config.js');

var  MongoClient=require('mongodb').MongoClient;
var ObjectID = require('mongodb').ObjectID;   /*查找_id*/
var dbUrl =config.dbUrl;


//封装连接数据库的方法

function _connect(callback){

    MongoClient.connect(dbUrl,function(err,db){
        if(err){
            console.log('数据库连接失败');
            console.log(err);
            return;
        }
        callback(db);

    })
}

exports.ObjectID=ObjectID;

/*
 db.find('user',{},function(err,data){
        console.log(data)
 })

* */


/*
* json1 条件
* json2  列数
* json3 配置信息
* */
exports.find=function(collectionName,json1,json2,json3,callback){

    if(arguments.length==3){
        var cb=json2;
        var col={};  /*查询的列*/
        var skip=0;
        var limit=0;
    }else if(arguments.length==4){

        var cb=json3;
        var col=json2;  /*查询的列*/
        var skip=0;
        var limit=0;
    }else if(arguments.length==5){
        var cb=callback;
        var col=json2;  /*查询的列*/
        //json3={
        //    page,
        //    pageSize
        //}
        var limit=json3.pageSize || 10;   /*如果pageSize 每页10条*/

        var skip=json3.page? (json3.page-1)*limit : 0;  /*page每页传显示第一页*/

    }else{
        console.log('传入参数错误');
        return;
    }

    _connect(function(db){

       var result=db.collection(collectionName).find(json1,col).skip(skip).limit(limit);

        result.toArray(function(err,data){
            db.close();
            cb(err,data);

        })
    })

}

/*
 db.insert("user",{"name":"zhangsan"},function(){

 })

增加数据
* */

exports.insert=function(collectionName,json,callback){

    _connect(function(db){
        db.collection(collectionName).insertOne(json,function(err,result){
            db.close();
            callback(err,result);
        })
    })

}



/*

db.update('user',{"id":123},{'name':"zhangsan"},function(){

})
更新数据
*
* */
exports.update=function(collectionName,json1,json2,callback){

    _connect(function(db){
        db.collection(collectionName).updateOne(json1,{
            $set:json2
        },function(err,result){
            db.close();
            callback(err,result);
        })
    })


}



//封装删除的方法

exports.remove=function(collectionName,json,callback){

    _connect(function(db){
        db.collection(collectionName).removeOne(json,function(err,result){
            db.close();
            callback(err,result);
        })
    })


}

exports.count=function(collectionName,json,callback){

    _connect(function(db){
        db.collection(collectionName).count(json,function(err,data){

            callback(err,data)
        })
    })


}

index.ejs

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>

    <script src="/jquery-1.11.3.min.js"></script>

    <script src="http://192.168.0.3:8000/socket.io/socket.io.js"></script>

    <style>

        .box{
            width: 300px;
            height: 400px;
            margin: 0 auto;
            border: 1px solid #666;
            margin-top:20px;


        }
        .list{
            width: 300px;
            height: 360px;
            overflow-y: auto;
        }
        .message{
            height: 40px;
            line-height: 44px;
            display: flex;
        }
        .message input{

            border: 1px solid #666;
        }
        .message input[type='text']{
            flex: 1;
            height: 38px;
        }
        .message input[type='button']{
            width: 100px;
            height: 40px;
            border: 1px solid #666;
        }
    </style>
</head>
<body>



    <div class="box">

        <div class="list">
            <div id="list">


            </div>
            <div class="footer" id="footer">

            </div>
        </div>
        
        <div class="message">
            <input type="text" id="msg" />
            <input type="button" id="send" value="发送"/>
        </div>


    </div>
</body>
</html>

<script>


    $(function(){

        var socket = io.connect('http://192.168.0.3:8000/');

        socket.on('servermessage',function(data){

            if(data.result.length)

            {
                var str='<ul>';
                for(var i=0;i<data.result.length;i++){

                    str+='<li>'+data.result[i].title+'</li>';
                }
                str+='</ul>';
            }else{

                var str='<p>没有找到您要的数据,请联系人工客服</p>'
            }
            $('#list').append(str);
            $('#footer').get(0).scrollIntoView();

        })

        var username='zhangsan'+Math.floor(Math.random()*10);

        //群聊功能--聊天室
        $('#send').click(function(){
            var msg=$('#msg').val();
            socket.emit('message',{
                'username':username,
                'msg':msg
            });
            $('#list').append(`<p><strong>${username}:</strong>  ${msg}</p>`);

            $('#msg').val();

        })
    })
</script>
原文地址:https://www.cnblogs.com/loaderman/p/11581599.html