Skip to content

blog搭建学习笔记

Xiaoqq edited this page Nov 16, 2015 · 12 revisions

1. 导入导出模块

module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。如果你想你的模块是一个特定的类型就用module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。

2. Node.js核心模块

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():异步写到数据文件中。

3. 使用HTTP模块创建一个简单的服务器

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');

4. Express.js开发小型服务器

var app = require('express')();
app.get('/',function(req,res){
  res.send('test');
}).listen('3000');

5. Express.js路由

启动脚本index.js的app.get方法,用于指定不同的访问路径所对应的回调函数,这叫做“路由”(routing)。相应的,还有app.post、app.put、app.del(delete是JavaScript保留字,所以改叫del)方法。

6. Express.js路由的Router

从Express 4.0开始,路由器功能成了一个单独的组件Express.Router。它好像小型的express应用程序一样,有自己的use、get、param和route方法。 route方法,可以接受访问路径作为参数;param方法用于路径参数的处理 use方法为router对象指定中间件,即在数据正式发给用户之前,对数据进行处理。 设置路由:app.use(‘/***’,router);

7. Express.js中间件

中间件(middleware)就是处理HTTP请求的函数。它最大的特点就是,一个中间件处理完,再传递给下一个中间件。use是express注册中间件的方法,它返回一个函数。

all方法表示,所有请求都必须通过该中间件,参数中的“*”表示对所有路径有效。

set方法用于指定变量的值。

app.set("views", __dirname + "/views");
app.set("view engine", "jade");

上面代码使用set方法,为系统变量“views”和“view engine”指定值。

8. Nodejs中的response对象

  • response.redirect()方法允许网址的重定向
  • response.sendFile()方法用于发送文件
  • response.render()方法用于渲染网页模板

9. Node.js中Session和Cookie的使用

  • 为了解决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

10. MongoDB的ORM类库Mongoose使用

  • 使用mongoose.connect('mongodb://localhost/myblog');来连接数据库。
  • 使用mongoose.Schema建立原型,再通过mongoose.model(name,schema)建立模型。
  • Model.create(data,callback)创建新文档,find()查找,update()更新。

11. 使用multer实现文件上传。

app.use(multer({  dest: '../public/images/'}));

12. 使用Socket.io实现多人聊天

  • 首先引入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});
}