node.js学习笔记(2)

1.模块化操作数据库

1.创建数据库公共模块db.js

var mysql = require("mysql");

function query(sql,parmeters callFunction) {
    //创建数据库连接对象
    var connection = mysql.createConnection(
        {
            host: "192.168.40.114",
            user: "test",
            password: "b123",
            database: "ex1db"
        }
    );

    connection.connect(); //打开数据库连接

    connection.query(sql, parmeters ,callFunction); //执行sql

    connection.end(); //关闭数据连接
}

exports.query = query;
//module.exports = query; 

2. 封装具体数据库表操作模块 departmentDao.js

var mysqldb = require("./db");
/**
 * 查询部门信息
 */
function findDepartment() {
    var sql = "SELECT * FROM department";
    mysqldb.query(sql, function (err, data) {
        if (err) {
            console.log("数据库出错" + err);
            return;
        }
   console.log(JSON.stringify(data));
        for (var department of data) {
            console.log(department.d_name + "\t" + department.d_location);
        }
    });
}

/**
 * 插入部门数据
 */
function addDepartment() {
    var sql1 = "INSERT INTO department (d_no,d_name,d_location)VALUES(50,'技术部','成都')";
    mysqldb.query(sql1, function (err, data) {
        if (err) {
            console.log("插入数据出错" + err);
            return;
        }

        console.log("插入数据成功!");
    });
}

exports.findDepartment = findDepartment;
exports.addDepartment = addDepartment;


3. 实现测试数据库操作模块 departmentDaoTest.js

 var userDao = require("./departmentDao ");

userDao.findDepartment();

4.传参使用占位符

* 插入部门数据
 * @param {编号} no 
 * @param {部门名} name 
 * @param {位置} location 
 */
function addDepartment(no, name, location) {
    // var sql1 = "INSERT INTO department (d_no,d_name,d_location)VALUES("+no+",'"+name+"','"+location+"')";  //SQL 注入
    var sql1 = "INSERT INTO department (d_no,d_name,d_location)VALUES(?,?,?)";  //占位符?
    var parmeters = [no, name, location];  //参数 数组对象

    query(sql1, parmeters, function (err, data) {
        if (err) {
            console.log("插入数据出错" + err);
            return;
        }

        console.log("插入数据成功!");
    });
}

2.Node.js开发用JavaScript编写Web服务器程序

1. Web服务器

为什么需要web服务器,作用是什么?
Web服务器有哪些nginx apache tomcat

2. Nginx服务器

1.简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2.下载安装

在这里插入图片描述
下载地址: http://nginx.org/

3. 目录结构

在这里插入图片描述

4. 启动服务

打开命令窗口,进入nginx安装目录,执行命令:nginx
在这里插入图片描述
打开浏览器,输入localhost 或者你的IP地址
出现如下页面表示服务启动成功
在这里插入图片描述

5.部署网站

拷贝你写好的网页到nginx安装目录下html子目录
在这里插入图片描述
在这里插入图片描述
访问网页: http://192.168.41.16/listweb/list.html

6. nginx常用命令

nginx常用命令:
验证配置是否正确: nginx -t
查看Nginx的版本号:nginx -V
启动Nginx:start nginx
快速停止或关闭Nginx:nginx -s stop
正常停止或关闭Nginx:nginx -s quit
配置文件修改重装载命令:nginx -s reload

错误

nginx: [error] CreateFile() “E:\nginx-1.13.5/logs/nginx.pid” failed
nginx: [error] Open() “E:\nginx-1.13.5/logs/nginx.pid” failed
解决方法:
使用命令创建/logs/nginx.pid文件:
nginx -c conf/nginx.conf

3. http协议

1、HTTP(超文本传输协议)

HTTP是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

2、HTTP请求响应模式

在这里插入图片描述

3、HTTP协议的主要特点

1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

4、HTTP协议之URL

HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]

http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http://192.168.0.116:8080/index.html

5. HTTP请求request

一次请求就是向目标服务器发送一串文本。什么样的文本?有下面结构的文本。
1.HTTP请求包结构
在这里插入图片描述http请求由三部分组成,分别是:请求行、请求头部、请求包体(正文)

1>请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,
格式如下:Method Request-URL HTTP-Version CRLF

其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

2>Http请求方式

方法 描述
GET 请求指定url的数据,请求体为空(例如打开网页)。
POST 请求指定url的数据,同时传递参数(在请求体中)。
HEAD 类似于get请求,只不过返回的响应体为空,用于获取响应头。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

常用只有Post与Get。
例子:

 POST  /home/user/login.html  HTTP/1.1                                   //请求行
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded

username=admin&password=123456                          //请求内容正文
{username:admin,password:123456}

 GET /home/user/login.html?username=admin&password=123456  HTTP/1.1       //请求行
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded

6. HTTP响应response

HTTP响应包结构
在这里插入图片描述HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、 说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
405 //方法不被允许
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
例子:
HTTP/1.1 200 OK
Date: Sat, 02 Jan 2016 13:20:55 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.6.14
X-Powered-By: PHP/5.6.14
Content-Length: 78
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
{“status”:202752,“info”:"\u6b64\u 8\u6237\u4e0d\u5b58\u5728\uff01",“data”:null}

7.请求响应示例

在这里插入图片描述

4. 用Node.js实现一个HTTP服务器程序

1.示例
 var http = require("http");

var server = http.createServer(function (request, response) {
     response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});//解决中文乱码问题
     response.end('{"student ": [{"name":"admin","number":1001},{"name":"小明","number":1002}]}');
});

server.listen(8080); 

console.log("启动web服务器,监听8080; http://192.168.40.114:8080");

2.chrome json插件安装

1 下载离线jsonview插件包
2 选择更多工具->扩展程序
3 打开开发者模式->选择离线包
在这里插入图片描述

3.读取文件数据响应给浏览器客端
var http = require("http");
var fs = require("fs");  //文件模块  

var server = http.createServer(function (request, response) {
    var filedir ="./data.json";
    fs.readFile(filedir, function (err, data) {
        if (err) {
            console.log("读文件出错" + err);
            return;
        }

        response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
        response.end(data.toString());
    });

});

server.listen(8080);

console.log("启动web服务器,监听8080; http://192.168.40.114:8080");

4.读取数据库数据响应给浏览器客户端
var http = require("http");
var db = require("./db/db");

var server = http.createServer(function(request,response){

    var sql = "SELECT * FROM department";
    db.query(sql, function (err, data) {
        if (err) {
            console.log("数据库出错" + err);
            return;
        }

        // console.log(JSON.stringify(data));
        response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
        response.end(JSON.stringify(data));
    });

});
server.listen(8089);

5. Path模块使用
 var path = require("path");

//解析当前目录:
var currenDir = path.resolve('.');
console.log(currenDir);

var dir = path.join(currenDir,"public","index.html"); //httpdemo\src\public\index.html
console.log(dir);

6.处理浏览器客户端请求,动态拼接访问资源路径
var http = require("http");
var fs = require("fs");  //文件模块  
var url = require("url"); //url模块        url.parse(request.url);  
var path = require("path"); //文件路径模块  path.resolve(".");    path.join()
var util = require("util"); //工具模块      util.insepct(object) =>将对象参数传换为字符串输出

var server = http.createServer(function (request, response) {
    
    var reqUrl = url.parse(request.url);
    console.log(util.inspect(reqUrl)); //util.insepct(object) =>将对象参数传换为字符串输出

    console.log("request.reqUrl :"+reqUrl.pathname+ " query :"+reqUrl.query); ///public/js/my.js
    
    var currentDir = path.resolve("."); //当前目录
    var dir = path.join(currentDir,reqUrl.pathname); //路径拼接  e://hellodemo/public/js/my.js
    console.log("dir :"+dir);


});

server.listen(8080);

console.log("启动web服务器,监听8080; http://192.168.40.114:8080");

5.Express框架

1.官网: http://www.expressjs.com.cn/
在这里插入图片描述

基础使用
1.安装

首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。

$ mkdir myapp
$ cd myapp

通过 npm init 命令为你的应用创建一个 package.json 文件。 欲了解 package.json 是如何起作用的,请参考 Specifics of npm’s package.json handling.
$ npm init
此命令将要求你输入几个参数,例如此应用的名称和版本。 你可以直接按“回车”键接受大部分默认设置即可,
接下来在 myapp 目录下安装 Express 并将其保存到依赖列表中。如下:
$ npm install express --save

2启动服务响应Helloword
var express = require("express");
var db = require("./db");

var app = express();

/**
 *   http://192.168.40.114:8081/hello
 */
app.get("/hello",function(req,res){
    res.send("hello"); //响应内容
});

/**
 * 启动web服务监听8081端口
 */
app.listen(8081,function(){
    console.log("服务端启动, http://192.168.40.114:8081");
});
3.Post请求处理
 var express = require("express");
var db = require("./db");

var app = express();

//get请求方法, 
//find请求url地址 
app.get("/find",function(req,res){
    res.send("find get >>>>>");  //响应内容
});

//post请求方法, 
//find请求url地址 
app.post("/find",function(req,res){
    res.send("find post >>>>>"); //响应内容
});

/**
 * 启动web服务监听8081端口
 */
app.listen(8081,function(){
    console.log("服务端启动, http://192.168.40.114:8081");
});

4响应数据库查询数据

db.js 模块

 var mysql = require("mysql");

function query(sql,parmeters, callFunction) {
    //创建数据库连接对象
    var connection = mysql.createConnection(
        {
            host: "192.168.40.114",
            user: "test",
            password: "b123",
            database: "ex1db"
        }
    );

    connection.connect(); //打开数据库连接

    connection.query(sql,parmeters,callFunction); //执行sql

    connection.end(); //关闭数据连接
}

exports.query = query;
//module.exports = query;

app.js 模块

var express = require("express");
var db = require("./db");

var app = express();

app.get("/find",function(req,res){
    var sql = "SELECT * FROM department";
    db.query(sql,function(err,data){
        if(err){
            console.log("查询数据出错");
            return;
        }
        var datajson = JSON.stringify(data);
        res.send(datajson);

    });
});

/**
 * 启动web服务监听8081端口
 */
app.listen(8081,function(){
    console.log("服务端启动, http://192.168.40.114:8081");
});
5.postman插件使用

1.安装方法参见jsonview插件
2.启动插件
在这里插入图片描述3.使用
在这里插入图片描述

6. http请求响应模式深入理解

1. 通过抓包工具理解http请求响应过程

在这里插入图片描述

2 Get请求和post请求区别
1. 参数位置不同

在这里插入图片描述在这里插入图片描述

7、body-parser express中间件使用

body-parser是非常常用的一个express中间件,作用是对http请求体进行解析。使用非常简单,以下两行代码已经覆盖了大部分的使用场景。

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
1.入门基础

在正式讲解前,我们先来看一个POST请求的报文,如下所示。

POST /test HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: text/plain; charset=utf8
Content-Encoding: gzip

Chyingp

其中需要我们注意的有Content-Type、Content-Encoding以及报文主体:
• Content-Type:请求报文主体的类型、编码。常见的类型有text/plain、application/json、application/x-www-form-urlencoded。常见的编码有utf8、gbk等。
• Content-Encoding:声明报文主体的压缩格式,常见的取值有gzip、deflate、identity。
• 报文主体:这里是个普通的文本字符串chyingp。

2.body-parser主要做了什么

body-parser实现的要点如下:

  1. 处理不同类型的请求体:比如text、json、urlencoded等,对应的报文主体的格式�不同。
  2. 处理不同的编码:比如utf8、gbk等。
  3. 处理不同的压缩类型:比如gzip、deflare等。
  4. 其他边界、异常的处理。
3.处理不同类型请求体
var express = require('express')
var bodyParser = require('body-parser')

const localPort = 3000
var app = express()

// create application/json parser
var jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
// app.use(urlencodedParser);  //处理名称值对参

app.use(jsonParser); //处理json请求参数

app.post('/login.do', (req, res) => {
    console.log('********************')
    console.log(req.body)

    res.send(req.body);
})

app.listen(localPort, function() {
    console.log('http://127.0.0.1:%s', localPort)
})

4.body-parser模块使用步骤
      第一步: 安装body-parser模块
                 npm  install body-parser
          第二步: 获取模块,创建解析器
               var bodyParser = require('body-parser') //获取模块
                var jsonParser = bodyParser.json();  // 创建 application/json 解析    如: {名称1:值1,名称2:值2}
                var urlencodedParser = bodyParser.urlencoded({ extended: false });// 创建 application/x-www-form-urlencoded 解析  如: 名称1=值1&名称2=值2
           第三步: body-parser与exprerss web框架整合
                app.use(jsonParser);
                app.use(urlencodedParser);
           第四步: 获取参数值
               1. get请求
                   值1 = req.query.名称1
               2. post请求
                  值1 = req.body.名称1

8.利用 Express 托管静态文件

为了提供诸如图像、CSS 文件和 JavaScript 文件之类的静态文件,请使用 Express 中的 express.static 内置中间件函数。
此函数特征如下:
express.static(root, [options])
The root argument specifies the root directory from which to serve static assets. For more information on the options argument, see express.static.
例如,通过如下代码就可以将 public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了:

app.use(express.static('public'))

现在,你就可以访问 public 目录中的所有文件了:

http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html

Express 在静态目录查找文件,因此,存放静态文件的目录名不会出现在 URL 中。
如果要使用多个静态资源目录,请多次调用 express.static 中间件函数:

app.use(express.static('public'))
app.use(express.static('files'))

访问静态资源文件时,express.static 中间件函数会根据目录的添加顺序查找所需的文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值