node.js开发web server博客项目(1)

1,904 阅读4分钟

一、nodejs与javascript的区别

1.1 ECMAScript

  • 不能操作DOM 不能监听click事件,不能发送ajax请求
  • 不能处理http请求 不能操作文件
  • 只有ECMAScript不能做任何实际的项目

1.2 javascript

  • 使用ECMAScript语法规范 外加Web API
  • DOM操作 BOM操作 事件绑定 Ajax
  • 两者结合 即可完成浏览器端任何操作

1.3 nodejs

  • 使用ECMAScript语法规范 外加nodejs API 缺一不可
  • 处理http 处理文件
  • 两者结合 完成server端的操作
{
  "name": "debugger-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",  // 重要 入口文件
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
// app.js
const http = require('http');

// 用http模块创建一个服务 服务端返回两个参数req,res
const server = http.createServer((req,res)=>{
    res.writeHead(200,{
        'content-type': 'text/html' // 返回的信息格式是html格式
    })
    res.end('<h1>hello world</h1>') // 返回的具体内容
})
server.listen(3000,()=>{
    console.log('listening on 3000 port')
})

1.4 server端开发和前端开发的区别

  • 服务稳定性
    • server端可能会遭受各种恶意攻击和误操作
    • 单个客户端可以意外挂掉,但是服务端不能
    • 使用PM2做进程守候 -- 指进程一旦挂掉会自动重启 不用人工
  • 考虑内存和CPU(优化,扩展)
    • 客户端独占一个浏览器,内存和CPU都不是问题
    • server端要承载很多请求,CPU和内存都是稀缺资源
    • 使用stream写日志(优化),使用redis存session(扩展)
  • 日志记录 对server端非常重要
    • 前端也会参与写日志,但只是日志的发起方,不关心后续
    • server端要记录日志,存储日志,分析日志,前端不关心
    • 多种日志记录方式,如何分析日志,根据不同情况选择不同的日志记录的方式
  • 安全 前端可以轻易攻破 但server端不会轻易被攻破
    • server端要随时准备接收各种恶意攻击,前端则很少
    • 如:越权操作,数据库攻击
    • 登录验证 预防xss攻击和sql注入
  • 集群和服务拆分 server端承载的流量越来越大
    • 产品发展速度快,流量可能会迅速增加
    • 通过扩展机器和服务拆分来承载大流量

二、项目分析

2.1 项目实现目标

  • 开发一个博客系统 具有博客的基本功能
  • 只开发server端,不关心前端

2.2 项目需求分析

  • 首页,作者主页,博客详情页
  • 登录页
  • 管理中心,新建页,编辑页

2.3 项目技术方案

  • 数据如何存储
    • 博客

- 用户 -- 登录 作者

  • 如何与前端对接,即接口设计

三、开发接口

// app.js
const http = require('http');

// 用http模块创建一个服务 服务端返回两个参数req,res
const server = http.createServer((req,res)=>{
    res.writeHead(200,{
        'content-type': 'text/html' // 返回的信息格式是html格式
    })
    res.end('<h1>hello world</h1>') // 返回的具体内容
})
server.listen(8000,()=>{
    console.log('listening on 8000 port')
})

3.1 从输入url到页面渲染的过程?

  • DNS解析(解析到一个IP地址),客户端和服务器端建立TCP连接,发送http请求
    • 客户端找到服务器,会三次握手
    • 第一次握手:客户端询问服务器 是否可以用
    • 第二次握手:服务器端告诉客户端可用
    • 第三次握手:客户端告诉服务器端,即将访问 发送http请求
    • server端接收到http请求,处理,并返回
      • nodejs处理http请求

      • get请求和querystring(url参数)

        • get请求 即客户端要向server端获取数据,如查询博客列表
        • 通过querystring来传递数据,如a.html?a=100&b=200
        • 浏览器直接访问,就发送get请求
        const http = require('http');
        const querystring = require('querystring');
        const server = http.createServer((req,res)=>{
            console.log(req.method) // GET
            const url = req.url // 获取请求的完整url
            req.query = querystring.parse(url.split('?')[1]) // 解析querystring
            res.end(JSON.stringify(req.query));//将querystring返回
        });
        server.listen(8000);
        
      • post请求和postdata

        • 客户端要像服务端传递数据,如新建博客
        • 通过postData传递数据
        • 浏览器无法直接模拟,需要手写js,或者使用postman
const http = require('http');
const server = http.createServer((req,res)=>{
    if(req.method === 'POST'){
        // 数据格式
        conssole.log('content-type', req.headers['content-type']);
        // 接受数据
        let postData = "";
        req.on('data',chunk=>{
            postData += chunk.toString()
        });
        req.on('end',()=>{
            console.log(postData);
            res.end('hello world'); //在这里返回,因为是异步
        })
    }
});
server.listen(8000);
    - 路由(接口地址)
const http=require('http');
const server = http.createServer((req,res)=>{
    const url= req.url;
    const path = url.split('?')[0];
    res.end(path); //返回路由
});
server.listen(8000);
  • 客户端接收到返回数据,处理数据(如渲染页面,执行JS)

四、博客项目

4.1 搭建环境

  • blog-1

    • bin
      • www.js
    • app.js 存放http.createServer()内的回调函数
  • npm init -y 入口文件改成 "main": "bin/www.js",

  • yarn add nodemon cross-env --save-dev 安装

    • nodemon 可以监控文件变化 可以自动重启node 不需要手动重启
    • cross-env 识别当前的环境 开发环境-dev 线上环境-production
    //package.json
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js"
    },
    
  • npm run dev

4.2 开发接口-初始化路由

  • 返回假数据:将路由和数据处理分离,以符合设计原则