在微信這個(gè)聊天工具里的小程序上實(shí)現(xiàn)聊天功能,總感覺(jué)怪怪的。但領(lǐng)導(dǎo)要求了,總是要干的。
10年的大慶網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整大慶建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“大慶網(wǎng)站設(shè)計(jì)”,“大慶網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
然后就實(shí)時(shí)通訊這個(gè)關(guān)鍵詞展開(kāi)搜索,穿梭于網(wǎng)頁(yè)之間。不過(guò)粘貼復(fù)制的真的太多了,找了半天也沒(méi)找到想要的,不過(guò)還是提取到了關(guān)鍵詞的WebSocket和node.js的,然后搜索這兩是啥,什么關(guān)系,總算明白了一點(diǎn)。
最后確定了第一步需要干的是用node.js搭建服務(wù)(我是裝在自己的windows下的):
1.首先到官網(wǎng)下載node.js,下載鏈接
安裝很簡(jiǎn)單,雙擊下載好的文件,直接下一步一步,沒(méi)什么特殊的選擇,路徑默認(rèn)就好
可以打開(kāi)命令行窗口輸入 node -v會(huì)輸出版本,來(lái)檢驗(yàn)是否安裝成功,其實(shí)這個(gè)也沒(méi)什么必要
2.然后新建一個(gè)文件夾(我的node.js是安裝在Ç盤(pán)的,然后再d盤(pán)下新建了個(gè)叫webSocket的文件夾)
然后用命令轉(zhuǎn)到該目錄下:在這個(gè)文件下安裝我們要使用的模塊:安裝模塊前需要先生成一個(gè)配置文件,不然會(huì)報(bào)錯(cuò)(反正我報(bào)了)
生成配置文件命令:npm init -f
執(zhí)行后可以看到在該文件下多了一個(gè)叫package.json的配置文件,先不用管(后面也沒(méi)管過(guò)),接下來(lái)繼續(xù)安裝模塊的操作
剛開(kāi)始我是安裝的socket.io,后來(lái)發(fā)現(xiàn)小程序根本用不了,所以這里也不說(shuō)socket.io了。我們這里用ws
安裝ws命令:npm install --save ws
(卸載模塊命令:npm uninstall 模塊名字)
3.安裝好模塊后,在你目錄下創(chuàng)建一個(gè).js文件,我這是一個(gè)ws.js
我這里肯定會(huì)比你們的文件要多,不用在意。
然后打開(kāi)這個(gè).js文件,開(kāi)始編輯你的服務(wù)端代碼,這個(gè)隨便你用記事本還是其他什么軟件
這是最簡(jiǎn)單基礎(chǔ)的一個(gè)打開(kāi)連接,響應(yīng)的代碼:
//引入ws模塊 const WebSocket = require('ws'); //創(chuàng)建服務(wù) port是端口 const wss = new WebSocket.Server({ port: 80}); //客戶端連接時(shí)會(huì)進(jìn)這個(gè) wss.on('connection', function connection(ws) { console.log('連接成功'); //客戶端發(fā)送消息時(shí)會(huì)觸發(fā)這個(gè) ws.on('message', function incoming(data) { console.log('收到消息'); //data是客戶端發(fā)送的消息,這里clients.foreach是廣播給所有客戶端 wss.clients.forEach(function each(client) { //把客戶端發(fā)來(lái)的data,循環(huán)發(fā)給每個(gè)客戶端 client.send(data); }); }); });
這里貼上稍微比較完善的代碼,這里是用數(shù)據(jù)庫(kù)保存的發(fā)送的消息,用的MySQL,所以需要在安裝mysql模塊
npm install --save mysql
代碼:
這里有很多注釋的代碼,都是我鼓搗時(shí)用到的,可以無(wú)視或刪掉
這個(gè)MySQL的數(shù)據(jù)連接需要根據(jù)自己的修改,表也是
我這用到的表就兩個(gè)字段 id ,msg
var http=require('http'); var qs = require('querystring'); // var ws=require('ws'); var server=http.createServer(function (req, res) { res.end("This is a WebSockets server!"); }); var url = require('url'); //驗(yàn)證函數(shù) function ClientVerify(info) { var ret = false;//拒絕 //url參數(shù) var params = url.parse(info.req.url, true).query; //console.log(groupid); //groupid=params['groupid'] //誰(shuí)誰(shuí)誰(shuí)來(lái)到了討論組 // wss.clients.forEach(function each(client) { // client.send('233'); // }); return true; } var wss = new ws.Server( { server: server,verifyClient: ClientVerify } ); /*//引入數(shù)據(jù)庫(kù) var mysql = require('mysql'); //連接數(shù)據(jù)庫(kù)信息 普通版 var connection = mysql.createConnection({ host : '58.87.94.16', user : 'root', password : 'root', database : 'bootdo' });*/ //引入數(shù)據(jù)庫(kù) var mysql = require('mysql'); // 創(chuàng)建數(shù)據(jù)池 const pool = mysql.createPool({ host : '58.87.94.16', // 數(shù)據(jù)庫(kù)地址 user : 'root', // 數(shù)據(jù)庫(kù)用戶 password : 'root', // 數(shù)據(jù)庫(kù)密碼 database : 'bootdo' // 選中數(shù)據(jù)庫(kù) }) /*接收一個(gè)sql語(yǔ)句 以及所需的values 這里接收第二參數(shù)values的原因是可以使用mysql的占位符 '?' 比如 query(`select * from my_database where id = ?`, [1]) 好像可以直接使用pool.query,暫時(shí)不明*/ let query = function(sql,values,callback){ pool.getConnection(function(err,conn){ if(err){ callback(err,null,null); }else{ conn.query(sql,values,function(err,results,fields){ //釋放連接 conn.release(); //事件驅(qū)動(dòng)回調(diào) callback(err,results,fields); }); } }); }; module.exports=query; wss.on('connection', function connection(ws) { console.log('鏈接成功!'); //console.log(ws); //查詢歷史聊天記錄 廣播給連接的客戶端 var sql='select * from hi_test where groupid=1'; console.log('sql語(yǔ)句',sql); query(sql,function (err,res,fields) { console.log('sql操作返回:', res); if(res!=null){ ws.send(JSON.stringify(res)); } }); //監(jiān)聽(tīng)客戶端發(fā)送得消息 ws.on('message', function incoming(data) { console.log('來(lái)自客戶端得message:',data); //保存客戶端發(fā)送得消息到數(shù)據(jù)庫(kù) sql="insert into hi_test(msg) values(?)"; console.log('sql語(yǔ)句',sql); query(sql,data,function (err,res,fields) { console.log('sql操作返回:',res);//res.insertId }); var sendData=JSON.stringify([{msg:data}]) /** * 把消息發(fā)送到所有的客戶端 * wss.clients獲取所有鏈接的客戶端 */ wss.clients.forEach(function each(client) { client.send(sendData); }); }); }); server.listen(80, function listening() { console.log('
然后命令行輸入node ws.js(你自己的文件名)回車(chē),就已經(jīng)啟動(dòng)了服務(wù)
4.現(xiàn)在服務(wù)就已經(jīng)起來(lái)了,接下來(lái)弄小程序這邊的
直接貼代碼:
wxml:
<view class='homeView'> <scroll-view scroll-y scroll-top='{{scrolltop}}'> <view class='listView'> <block wx:for="{{serverMsg}}" wx:key='*this'> <!-- --> <view wx:if="{{item.user.id!=userInfo.userId}}" class='leftView'> <view class='name'>{{item.user.name}}</view> <view class='imgmsgleft'> <view> <!-- 我這用的是自己另一個(gè)服務(wù)的圖片 --> <image class='touimg' src='https://www.tjjxsoft.cn/static/images/img005.png'></image> </view> <view>{{item.msg}}</view> </view> </view> <view wx:else class='rightView'> <view class='name'>{{item.user.name}}</view> <view class='imgmsg'> <view>{{item.msg}}</view> <view> <!-- 我這用的是自己另一個(gè)服務(wù)的圖片 --> <image class='touimg' src='https://www.tjjxsoft.cn/static/images/img005.png'></image> </view> </view> </view> </block> </view> </scroll-view> <view class='sendView'> <input bindinput='sendTextBind' placeholder="輸入聊天內(nèi)容" value='{{sendText}}' /> <button bindtap='sendBtn' type="primary">發(fā)送</button> </view> </view>
js:
var app = getApp(); Page({ data: { socket_open: false,//判斷連接是否打開(kāi) sendText: "",//發(fā)送的消息 serverMsg: [],//接受的服務(wù)端的消息 userInfo: { userId: 1, name: "呵呵",img:'頭像'},//app.appData.userInfo, scrolltop: 999 }, /**輸入內(nèi)容 */ sendTextBind: function(e) { this.setData({ sendText: e.detail.value }); console.log(this.data.sendText); }, /**發(fā)送消息 */ sendBtn: function(e) { console.log('發(fā)送消息事件!'); var msgJson = { user: { id: this.data.userInfo.userId,//app.appData.userInfo.userId, //唯一ID區(qū)分身份 name: this.data.userInfo.name, //顯示用姓名 img: this.data.userInfo.img, //顯示用頭像 }, msg: this.data.sendText,//發(fā)送的消息 groupid:1 } //發(fā)送消息 this.send_socket_message(JSON.stringify(msgJson)); this.setData({ sendText: ""http://發(fā)送消息后,清空文本框 }); }, onLoad: function(options) { // app.login(); // this.setData({ // userInfo: app.appData.userInfo // }); //初始化 this.wssInit(); }, wssInit() { var that = this; //建立連接 wx.connectSocket({ url: 'ws://localhost'//app.appData.socket }) //監(jiān)聽(tīng)WebSocket連接打開(kāi)事件。 wx.onSocketOpen(function(res) { console.log('WebSocket連接已打開(kāi)!'); that.setData({ socket_open: true }); }); //監(jiān)聽(tīng)WebSocket接受到服務(wù)器的消息事件。 wx.onSocketMessage(function(res) { console.log('收到服務(wù)器內(nèi)容:', res); var server_msg = JSON.parse(res.data); console.log(server_msg); if (server_msg != null) { var msgnew = []; for (var i = 0; i < server_msg.length; i++) { msgnew.push(JSON.parse(server_msg[i].msg)); } msgnew=that.data.serverMsg.concat(msgnew); that.setData({ serverMsg: msgnew, scrolltop: msgnew.length * 100 }); console.log(that.data.serverMsg); } }); //監(jiān)聽(tīng)WebSocket錯(cuò)誤。 wx.onSocketError(function(res) { console.log('WebSocket連接打開(kāi)失敗,請(qǐng)檢查!', res) }); }, send_socket_message: function(msg) { //socket_open,連接打開(kāi)的回調(diào)后才會(huì)為true,然后才能發(fā)送消息 if (this.data.socket_open) { wx.sendSocketMessage({ data: msg }) } } })
wxss:
.homeView { border-top: 1px solid #ededed; } .listView{ padding-bottom: 50px; } .listView>view { padding: 10px; } .rightView { text-align: right; } .imgmsgleft { display: flex; justify-content: flex-start; align-items: center; } .imgmsgleft>view:last-child { border: solid 1px gray; padding: 10px; border-radius: 6px; } .imgmsg { display: flex; justify-content: flex-end; align-items: center; } .imgmsg>view:first-child { border: solid 1px gray; padding: 10px; border-radius: 6px; background-color: green; } .touimg { width: 50px; height: 50px; } .name { font-size: 14px; color: gray; } .sendView { display: flex; width: 100%; position: fixed; bottom: 0px; border-top: 1px #ededed solid; background-color: white; } .sendView>button { width: 20%; } .sendView>input { width: 80%; height: auto; }
效果圖:
預(yù)覽的時(shí)候一定要打開(kāi)調(diào)試,因?yàn)檫@不是WSS協(xié)議,是沒(méi)法直接用的、
總結(jié)
以上所述是小編給大家介紹的使用node.js實(shí)現(xiàn)微信小程序?qū)崟r(shí)聊天功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!
分享題目:使用node.js實(shí)現(xiàn)微信小程序?qū)崟r(shí)聊天功能
新聞來(lái)源:http://jinyejixie.com/article40/jpdjho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)