1 Star 0 Fork 0

zmj / nodejs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
app.js 3.88 KB
一键复制 编辑 原始数据 按行查看 历史
zmj 提交于 2018-03-06 14:45 . 2018-3-6
const isProduction = process.env.NODE_ENV === 'production'
const Koa = require('koa')
const url = require('url')
const ws = require('ws')
const Cookies=require('cookies');
const bodyparser=require('koa-bodyparser');
const templating=require('./templating');
const controller=require('./controller');
const WebSocketServer = ws.Server
const rest=require('./rest')
const app = new Koa()
//第一个middleware记录url以及页面执行时间
app.use(async (ctx, next) => {
console.log(`Process ${ctx.method} ${ctx.url}`);
var start = new Date().getTime()
, execTime;
await next();
execTime = new Date().getTime() - start;
ctx.set('X-Response-Time', `${execTime}ms`);
})
app.use(async (ctx, next) => {
ctx.state.user = parseUser(ctx.cookies.get('name') || '');
await next();
})
//第二个middleware处理静态文件
if (!isProduction) {
let staticFiles = require('./static-files');
app.use(staticFiles('/static/', '/node_modules/'));
}
//第三个middleware解析post请求
app.use(bodyparser());
//第四个middleware给ctx添加render方法 来使用nunjucks
app.use(templating('views', {
noCache: !isProduction,
watch: !isProduction,
autoescape: isProduction
}));
//第五个middleware处理rest请求
app.use(rest.restify());
//最后一个middleware处理url路由
app.use(controller());
let server = app.listen(3001);
function createWebSocketServer(server, onConnection, onMessage, onClose, onError) {
let wss = new WebSocketServer({
server: server
});
wss.broadcast = data => {
wss.clients.forEach(client => {
client.send(data)
})
}
onConnection = onConnection || (()=> console.log('[WebSocket] connected.'))
onMessage = onMessage||(msg=>console.log('[WebSocket] message received'+msg))
onClose=onClose||((code,message)=>console.log(`[WebSocket] closed:${code}-${message}`))
onError=onError||(err=>console.log('[WebSocket] error:'+err))
wss.on('connection', function (ws,req) {
let location = url.parse(req.url, true)
console.log('[WebSocketServer] connection:'+location.href)
ws.on('message',onMessage)
ws.on('close',onClose)
ws.on('error',onError)
if(location.pathname!=='/ws/chat'){
ws.close(4000,'Invalid URL');
}
let user = parseUser(req);
console.log(req);
if (!user) {
ws.close(4001, 'Invalid user');
}
ws.user = user;
ws.wss = wss;
onConnection.apply(ws)
});
}
var messageIndex = 0;
function createMessage(type, user, data) {
messageIndex++;
return JSON.stringify({
id: messageIndex,
type: type,
user: user,
data: data
})
}
function onConnection(){
let user=this.user,
users=[],
msg=createMessage('join',user,`${user.name} joined`);
this.wss.broadcast(msg);
this.wss.clients.forEach(client=>{
users.push(client.user);
})
this.send(createMessage('list',user,users));
}
function onMessage(message){
console.log(message);
if(message&&message.trim()){
let msg=createMessage('chat',this.user,message.trim());
this.wss.broadcast(msg);
}
}
function onClose(){
let user=this.user;
let msg=createMessage('left',user,`${user.name} is left`);
this.wss.broadcast(msg);
}
function parseUser(obj) {
if (!obj) return;
console.log('try parse:' + obj);
let s = '';
if (typeof obj === 'string') {
s = obj;
} else if (obj.headers) {
let cookies = new Cookies(obj, null);
s = cookies.get('name');
}
if (s) {
try {
let user = JSON.parse(Buffer.from(s, 'base64').toString());
console.log(`User:${user.name},ID:${user.id}`);
return user;
} catch (e) {
console.log('报错了:' + e);
}
}
}
app.wss = createWebSocketServer(server,onConnection,onMessage,onClose);
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/zhiyuanzmj/nodejs.git
git@gitee.com:zhiyuanzmj/nodejs.git
zhiyuanzmj
nodejs
nodejs
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891