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实现的要点如下:
- 处理不同类型的请求体:比如text、json、urlencoded等,对应的报文主体的格式�不同。
- 处理不同的编码:比如utf8、gbk等。
- 处理不同的压缩类型:比如gzip、deflare等。
- 其他边界、异常的处理。
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 中间件函数会根据目录的添加顺序查找所需的文件。