blog搭建学习笔记
Xiaoqq edited this page Nov 16, 2015
·
12 revisions
module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。如果你想你的模块是一个特定的类型就用module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。
http:htttp.createServer():返回一个新的Web服务器对象;
http.listen():在指定主机名和端口上建立连接;
http.ServerRequest():将请求信息传递给request处理事件;
data:消息体数据被接收时发出该事件;
request.method():请求方法; request.url():请求的URL字符串;
http.ServerResponse():由HTTP创建,用于处理请求服务输出内容
response.writeHead:响应头;
response.write:响应内容;response.end:客户端结束发送响应内容。
querystring:提供了一些处理查询字符串的工具
querystring.stringify():将一个对象序列化为一个查询字符串;
querystring.parse():反序列化一个字符串为对象;
url:parse():接受一个URL字符串,返回转化后的对象;
fs:fs.readFile():异步读取文件内容;
fs.writeFile():异步写到数据文件中。
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html'});
res.end('<h1>pengchen</h1>');
}).listen('3000','127.0.0.1');
var app = require('express')();
app.get('/',function(req,res){
res.send('test');
}).listen('3000');
启动脚本index.js的app.get方法,用于指定不同的访问路径所对应的回调函数,这叫做“路由”(routing)。相应的,还有app.post、app.put、app.del(delete是JavaScript保留字,所以改叫del)方法。
从Express 4.0开始,路由器功能成了一个单独的组件Express.Router。它好像小型的express应用程序一样,有自己的use、get、param和route方法。 route方法,可以接受访问路径作为参数;param方法用于路径参数的处理 use方法为router对象指定中间件,即在数据正式发给用户之前,对数据进行处理。 设置路由:app.use(‘/***’,router);
中间件(middleware)就是处理HTTP请求的函数。它最大的特点就是,一个中间件处理完,再传递给下一个中间件。use是express注册中间件的方法,它返回一个函数。
all方法表示,所有请求都必须通过该中间件,参数中的“*”表示对所有路径有效。
set方法用于指定变量的值。
app.set("views", __dirname + "/views");
app.set("view engine", "jade");
上面代码使用set方法,为系统变量“views”和“view engine”指定值。
-
response.redirect()
方法允许网址的重定向 -
response.sendFile()
方法用于发送文件 -
response.render()
方法用于渲染网页模板
- 为了解决Http无状态的缺陷,从而引入和Session和Cookie。当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对,然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。客户的信息都保存在session中。
- nodejs中通过express-session来操作和使用session。使用req.session。
- 通过cookie-parser来操作cookie。在req对象中使用req.cookies
- 使用
mongoose.connect('mongodb://localhost/myblog');
来连接数据库。 - 使用mongoose.Schema建立原型,再通过
mongoose.model(name,schema)
建立模型。 -
Model.create(data,callback)
创建新文档,find()查找,update()更新。
app.use(multer({ dest: '../public/images/'}));
- 首先引入
socket.io
组件,绑定并且监听server
var io = require('socket.io').listen(server);
- 在Client(html)中引入socket.io.js和jQuery等相关脚本
script(type="text/javascript",src="/socket.io/socket.io.js")
script(type="text/javascript",src="/javascripts/jquery-2.0.3.min.js")
script(type="text/javascript",src="/javascripts/jquery.cookie.js")
script(type="text/javascript",src="/javascripts/chat.js")
- 使用绝对布局搭建好聊天页面,主要分为三块:聊天记录、输入窗口和在线用户列表
#content
#content_show
#contents
#content_saying
#input_content(contenteditable='true')
div='请输入...'
#say='发送'
#user_online
#usersbar
#user_label='在线用户'
#user_list
ul(id='list')
- 监听前后端三种事件:online、offline和chat
server:
io.sockets.on('connection', function (socket) {
socket.on('online', function (data) {
socket.name = data.user;
if (!users[data.user]) {
users[data.user] = data.user;
}
io.sockets.emit('online', {users: users, user: data.user});
});
socket.on('disconnect', function (data) {
if (users[socket.name]) {
delete users[socket.name];
socket.broadcast.emit('offline', {users: users, user: socket.name});
}
});
socket.on('chat', function (data) {
io.sockets.emit('chat', data);
});
});
client:
socket.emit('online',{user:from});
socket.on('online',function(data){
var message = $('<div>');
var start = $('<div>');
message.css('color','#f00').text("("+ $.getNow()+"): "+data.user+"进入了聊天室");
$('#contents').append(start).append(message).append('<br/>');
start[0].scrollIntoView();
flushUsers(data.users);
});
socket.on('offline',function(data){
var message = $('<div>');
var start = $('<div>');
message.css('color','#f00').text("("+ $.getNow()+"): "+data.user+"下线了");
$('#contents').append(start).append(message).append('<br/>');
start[0].scrollIntoView();
flushUsers(data.users);
});
socket.on('chat',function(data){
var message = $('<div>');
var start = $('<div>');
message.html(data.user+"("+ $.getNow()+")说: "+data.msg);
contents.append(start).append(message).append('<br/>');
//使页面滚动到'start'处
start[0].scrollIntoView();
});
- 实现桌面通知
判断是否有通知权限
Notification.requestPermission();
当页面隐藏的时候,实现消息的桌面通知
if(Notification.permission==='granted' && document.hidden && data.user!==from){
var notification = new Notification(data.user,{body:data.msg});
}