Node.js 学习笔记(2)

var http = require('http')
var server = http.createServer();

server.on('request', function (req, res) {
    res.statusCode = 404;
    res.statusMessage = "Not Found";
    res.end();
})

server.listen(8888, function () { 
    console.log("http://localhost:8888")
})

浏览器和服务器的通信过程

浏览器的工作原理

浏览器的5大组成部分

UISocketRender EngineJavaScript EngineStorage

web开发的本质

  1. 请求 2. 处理 3. 响应

Node.js

LTSCurrent

  1. REPL

  2. 执行文件

process.stdout.write

global

文件读写

fs.writeFile(文件路径, 写入内容, 编码格式, 回调函数) 写入默认字符编码为utf8

fs.readFile(文件路径, 编码格式, 回调函数)

路径 _dirname _filename

__dirname__filename

path.join

path.join(路径的一部分, 路径的一部分, 路径的一部分)

创建简单的http服务器

var http = require('http')
var server = http.createServer();

server.on('request', function(req, res){
    // ...
    res.end("响应结束")
})

server.listen(8888, function(){

})

设置响应头的方法

  1. res.setHeader(key, value) 一次只能设置一个响应头键值对

  2. res.writeHead(statusCode, statusMessage, {}) 一次只能设置多个响应头键值对

这两个方法都必须在write之前调用!

response的其他方法

write: 向浏览器返回数据 字符串 buffer对象end:statusCodestatusMessage

request.url

获取请求地址中的 路径+参数

路由

根据不同的url地址返回不同的内容

 

request对象中的内容

var http = require('http')
var server = http.createServer();

server.on('request', function (req, res) {
    
    // req.url:  请求地址中的 路径和参数
    // req.headers: 请求报文中的请求头信息,他是一个对象!
    // req.rawHeaders: 请求报文中的请求头信息,是一个数组!
    // req.httpVersion:  浏览器发送的http请求的协议的版本号!
    // req.method: 获取请求方式

    console.log(req.headers);
    // res.end("ok");

    if (req.method == "POST") {
        res.end("ok")
    } else {
        res.end("你的请求方式不被允许!!只能使用POST")
    }

})

server.listen(8888, function () { 
    console.log('http://localhost:8888')
})

在node.js中获取请求参数-get

// get请求的参数是用?拼接在url地址后面的

// 如何获取get请求的参数?

var http = require('http');
var server = http.createServer();
var querystring = require('querystring')
var url = require('url');

server.on('request', function (req, res) {

    // 获取get请求的参数
    // console.log(req.url);

    // 1. 自己动手,操作字符串获取参数信息
    // var params = {};

    // if (req.url.indexOf("?") != -1) {
    //     var querystring = req.url.split("?")[1];
    //     // querystring   name=pm&age=18

    //     querystring.split("&").forEach(function (v, i) {
    //         // v  name=pm
    //         // v  age=18
    //         var temp = v.split('=');
    //         params[temp[0]] = temp[1];
    //     })
    //     console.log(params);
    // }

    // 2. 使用querystring模块直接实现查询字符串的解析

    // if (req.url.indexOf("?") != -1) {
    //     var str = req.url.split("?")[1]
    //     var params = querystring.parse(str);
    //     console.log(params);
    // }

    // 3. 使用url模块进行参数的解析
    // req.url /?name=pm&age=18
    // url.parse方法可以将url字符串转换成对应的对象
    // 有两个参数:
    // url.parse(url, parseQueryString);

    // url: 要进行解析的url字符串
    // parseQueryString: 是一个布尔值,如果为true则最终解析出来的query是一个对象!如果是false则是一个字符串

    var urlObj = url.parse(req.url, true);
    // urlObj:  pathname: 路径部分的内容
            //   query: 参数部分的内容 默认情况下是一个字符串
    console.log(urlObj.query);


    res.end("ok");

})

server.listen(8888, function () {
    console.log('http://localhost:8888')
})

在node.js中获取请求参数-post

// post请求的参数是在请求体中的!

// 如何获取post请求参数呢?

var http = require('http');
var server = http.createServer();
var querystring = require('querystring');

var fs = require('fs')

server.on('request', function (req, res) { 

    // 获取post请求的参数

    // 0. 定义一个数组,用来存放每次接收到的数据
    var bufferList = [];

    // 1. 给req对象注册一个事件 data事件
    // 当有post请求的数据发送到服务器的时候,就会触发这个事件
    req.on('data', function (chunk) { 
        // post请求的数据可能会分多次发送给服务器
        // 每次发送给服务器都会触发data事件
        // 每次发送的数据可以通过chunk来接收  chunk是一个buffer对象
        // console.log(chunk);
        // 每次有新数据来就将数据添加到数组中
        bufferList.push(chunk);
    })

    // 2. 给req对象注册一个事件 end事件
    req.on('end', function () { 
        // end事件会在post数据发送完毕之后,触发
        // 如果要获取数据,肯定需要在end事件中进行获取!

        // 需要将数组中所有的buffer对象合并成一个buffer对象
        // 我们可以通过Buffer.concat方法进行buffer对象的合并
        var result = Buffer.concat(bufferList);
        fs.writeFile("./1.jpg", result, function (err) {
            console.log("ok")
        })

        // 如果要获取参数 则直接将result转换成字符串即可
        // console.log(result.toString());

        // 最后使用querystring模块,将这个参数字符串转换成对象即可!

        // var params = querystring.parse(result.toString());
        // console.log(params);

    })

    res.end('ok');
})

server.listen(8888, function () { 
    console.log('http://localhost:8888');
})

使用node.js模拟phpStudy

request对象的常用属性

request.urlrequest.headersrequest.rawHeadersrequest.methodrequest.httpVersion

请求参数的获取

get请求参数的获取

  1. querystring

var querystring = require('querystring')
// key=value&key=value  查询字符串

var obj = querystring.parse("key=value&key=value")

url

var url = require('url');
var obj = url.parse("/index.html?id=10", true)
// obj.query
// obj.pathname

post请求参数的获取

var bufferList = [];

req.on("data", function(chunk){
    bufferList.push(chunk);
})

req.on("end", function(){
    var result = Buffer.concat(bufferList);

    // result.toString();  // key=value&key=value;

    var params = querystring.parse(result.toString())
    // fs.writeFile("", result, function(){})
})

npm简介

Node Package Manager node包管理工具

包是什么???

三个关键内容

  1. npm服务器

  2. npm网站

  3. npm命令行工具

npm安装

只要安装好了node, 那么npm就自动安装好了

npm命令行工具的使用

在node装完之后,全局就有一个npm命令可以使用了

  1. 初始化一个pacakge.json文件npm initnpm init -y

如果当前文件夹名称包含中文等特殊字符,则npm init命令执行会报错,报错之后pacakge.json文件中的name和version属性为空,需要自己手动的补全!!

  1. 下载包(本地安装)下载的包会放到当前项目中的node_modules文件夹中! npm install 包名npm install 包名@版本号

npm i 包名npm i 包名@版本号

npm install 包名 包名1 包名2

  1. 卸载包npm uninstall 包名

全局安装

当要使用一个包,这个包会提供一个全局命令的时候,这个包就需要被全局安装!

命令npm install 包名 -gnpm install 包名 --global

live-servernpm install less -g

package.json

作用

package.json文件就是用来描述一个包的信息的!

只要一个文件夹中有一个合格的pacakge.json文件,那么这个文件夹就可以被称为是一个包!

合格的定义: 必须包含两个属性 name version

package.json文件中的属性

name: 包名 不能有中文,不能有空格,不能有大写字母,不能有特殊字符!version: 版本信息

description: 描述信息author: 作者keywords: 关键词 方便在npm网站上进行搜索license: 开源协议 自己指定

scripts: 放的就是一些shell命令,这些命令可以通过 npm run 命令别名 进行执行

可以省略run执行的命令别名: start stop restart test config
例如`npm start`

dependencies:devDependencies:

版本号说明

一般的版本号都会包含3个数字,中间用.隔开格式: 主版本号.次版本号.修订版本号

主版本号: 当代码功能更新,更新之后,不兼容之前的版本了,那么需要更新主版本号!此版本号: 当代码功能更新,更新之后,依然兼容之前的版本,只是新增了某些功能,那么需要更新次版本号修订版本号: 当代码更新,更新的只是修复了某些BUG,或者优化了某些功能,那么这个时候只需要更新 修订版本号就可以了

jquery: 1.x 2.x 3.x1.10.1 1.12.41.12.1 1.12.4

dependencies 和 devDependencies 的说明

这两个属性中保存的都是当前包所有的依赖信息。

dependencies: 运行时依赖项,在将代码上传到服务器时,这个包仍被需要devDependencies: 开发时依赖项,这个依赖项只需要在开发时时候,上传到服务器的时候不需要!

问题: 为什么要将依赖项信息存储起来呢???主要目的是为了代码共享的时候,比较方便!

在进行代码分享的时候,不需要分享node_modules,只需要分享自己的代码和pacakge.json即可,另外的程序员拿到代码之后,自己根据pacakge.json下载所有的依赖项即可!

npm install 这条命令会自动根据package.json中保存的包信息进行下载 (devDependencies+dependencies)

只下载运行时依赖项可以使用命令npm install --production

如何将依赖项的信息保存到dependencies 和 devDependencies中

在早期版本的npm中,依赖项信息不会自动保存!

  1. 将依赖项的信息保存到dependenciesnpm install 包 --savenpm install 包 -S

  2. 将依赖项的信息保存到devDependenciesnpm install 包 --save-devnpm install 包 -D

nrm

说明

npm服务器是在国外的,所以下载速度会比较慢,所以我们可以设置npm,让其下载包的时候,从国内的服务器上进行下载。

设置npm让其从国内服务器下载,需要用到一个工具,这个工具就是nrm

安装

npm install nrm -g

使用

  1. 查看可用的服务器列表nrm ls

  2. 查看当前正在使用的服务器nrm current

  3. 切换到指定的服务器nrm use 服务器名称

  4. 测速命令nrm testnrm test 指定的服务器名称

使用Node.js模拟PHPStudy

phpstudy的作用: 可以将浏览器请求的文件从根目录中找到进行返回

var http = require('http')
var server = http.createServer();
var fs = require('fs');
var path = require('path');
var mime = require('mime');
server.on('request', function(req, res){
    // 1. 制定路由规则,对每个文件进行挨个处理 (先做了首页)
    // 2. 将req.url用作读取文件的路径
    // 3. 为每个类型的文件设置不同的Content-Type 用到mime
    // 4. 设置在访问/的时候也能够访问到首页
    if(req.url == "/"){
        req.url = "/index.html"
    }
    res.setHeader("Content-Type", mime.getType(req.url));
    fs.readFile(path.join(__dirname, 'public', req.url), function(err, data){
        res.end(data);
    })

})

server.listen(8888, function(){
    console.log('http://localhost:8888')
})

request对象的常用属性

  • url: 请求地址中的路径+参数

  • headers: 请求头中的内容,是一个对象

  • rawHeaders: 请求头中的内容,是一个数组

  • method: 请求方式 是大写的GET POST

  • httpVersion: http协议的版本号

使用node.js获取请求参数

get请求参数

  1. querystring

var querystring = require('querystring');
var params = querystring.parse("key=value&key=value")

url(推荐使用)

var url = require('url')
var urlObj = url.parse(req.url, true);
// urlObj.pathname 就是路径部分
// urlObj.query 就是参数对象

post请求参数

var querystring = require('querystring')
//1. 定义一个数组用来存储每次提交上来的数据
var bufferList = [];

//2. 为req对象注册data事件 该事件会在每次有数据提交到服务器的时候被触发
req.on('data', function(chunk){
    //chunk就是每次提交上来的数据 buffer对象
    //将每次提交的数据存储到数组中
    bufferList.push(chunk);
})

//3. 为req对象注册end事件 该事件会在数据提交完毕之后触发
req.on('end', function(){
    // 将bufferList中所有的buffer对象合并成一个
    var result = Buffer.concat(bufferList);

    // 如果要获取post请求参数 则需要将这个对象转成字符串
    var qs = result.toString();

    // 使用querystring模块将获取到的post参数字符串转成对象
    var params = querystring.parse(qs);
})

npm

npm是node包管理工具

什么是包?

一组被pacakge.json描述的文件! (如果一个文件夹中有一个合法的package.json文件,那么这个文件夹就是一个包)

npm三个内容

  1. npm服务器 存储包

  2. npm网站 浏览包

  3. npm命令行工具 操作包(上传、下载)

npm的基本使用

  1. 创建一个package.json文件 一个项目只需要执行一次npm initnpm init -y如果文件夹名称中包含中文或者特殊字符,则创建会报错,但是文件会正常创建出来,需要手动的添加name和version的值

  2. 下载包(本地安装)npm install 包名npm install 包名@版本号npm i 包名npm i 包名@版本号npm install 包名 包名 包名

npm install 下载依赖项中所有的包npm install --production 下载所有运行时依赖项

  1. 卸载包npm uninstall 包名

全局安装

当需要安装的包要提供一个全局命令的时候,这个包就需要进行去全局安装npm install 包名 -gnpm install 包名 --global

live-serverlessnrm

package.json

必须包含的两项: name 和 version

scripts: 给shell命令起别名,可以通过别名进行执行 npm run 别名可以省略run的别名: start restart stop test config

dependencies: 运行时依赖项npm i 包名npm i 包名 --savenpm i 包名 -S

devDependencies: 开发时依赖项npm i 包名 --save-devnpm i 包名 -D

nrm

为npm提速(可以切换下载服务器)

查看所有的可用服务器列表
nrm ls  

切换到指定的服务器
nrm use 服务器名称

查看当前正在使用的服务器
nrm current

测试所有服务器的速度
nrm test

测试指定服务器的速度
nrm test 服务器名称

hacker-news

  1. 创建了项目文件夹

  2. 将views文件夹和resources文件移动到项目文件夹

  3. 创建了app.js

  4. 书写了基本的http服务器代码

  5. 制定基本的路由规则(3 ==> 4 ==> 5)

  6. 在路由规则中返回简单的字符串 进行测试

  7. 加一条路由规则 404

  8. 实现首页的功能(读取首页的html文件返回)

  9. css和图片无法处理(又要新增一条路由规则, 判断req.url是否以/resources开头)

  10. 在静态资源的路由规则中,使用phpStudy的类似逻辑实现静态资源的返回

  11. 详情页和添加页实现

  12. 优化了详情页的路由规则 (url模块)

你可能感兴趣的:(Node.js 学习笔记(2))