nidejs基础知识及服务器搭建。纯干货。抓紧收藏

图片发自简书App

今天学习的内容

1:复习昨天重点

2:大鱼喂小鱼;首页

  大鱼喂小鱼:

  大鱼碰撞小鱼,小鱼吃饱,小鱼身体图片下标 = 0

  碰撞检测: collsion.js 大鱼碰撞食物;

3:今天的目标

  3.1:nodejs 模块

  遇到问题:nodejs 作者nodejs 不足

  (1)生活示例:实用主义;完美主义

  (2)招聘条件:50% >公司(技术型,互联网公司)

  3.2:下载配置

  https://npm.taobao.org/mirrors/node

  node-v9.9.0-x64.msi  64位windows版本

  node-v9.9.0-x86.msi  32位windows版本

  node-v9.9.0.pkg      mac

  3.3:阿里面试题:用户在在浏览器输入 www.taobao.com直到

    看到网页发生了什么?

    (1)操作系访问网络的DNS服务器,把域名转ip地址

    (2)浏览器使用IP地址向淘宝发请求

    (3)淘宝服务器接收请求,并解析请求内容,查询找资源,

      可能数据库,构建并返回HTTP响应消息

    (4)浏览器接收并解析响应消息

    (5)浏览器缓存接收响应内容,并解析和渲染内容

 

  3.4:静态网页和动态网页

  静态:网页内容任何人任何时间访问都是不变的..

        HTML/CSS/JS/Flash/视频音频

  动态:网页内容不同人在不同时间访问可能是不同的..

        DB/JSP/PHP/ASP/Node.JS

  JSP=html+java  功能强大可靠,适合大型企业项目(阿里;银行)

  2003-2004 淘宝[php+mysql];->mysql(oracle)->php->java->服务器

            ->小型机->oracle->{服务器+java+OC(mysql)}--卡车

  PHP=html+php  简单易用:适合互联网项目(论坛)  --家用轿

  https://cn.wordpress.org/

  ASP.NET=html+c#  易用;贵点

  Node.js=html+js  性能好--(跑车)

 

node.js适合项目(io密集型) node.js 不适合项目(cpu密集型)

输入输出[查询;添加] 滴滴打车;天气预报...

       

 

  3.5:Node.JS

  Node.js不是js,是一种运行在服务器端开发平台(开发语言用js),

  历史上第一次有一种语言可以通吃前后台.

  https://npm.taobao.org/mirrors/node  淘宝镜像

 

  3.6:Node.JS 运行模式

  (1)交互模式---一般测试

    输入一行代码执行一行

    在命令行状态下输入

    node 回车

    退出 ctrl+c  二次

  (2)脚本模式--正式项目中使用方式

    把要执行的所有语句编写在一个文本文件中(后缀名任意,没有也行),一次性提交node解析器执行

    node  x.js  回车

  解释器: C:\Program Files\nodejs\node.exe

  练习:02_node.js 打印出九九乘法表,

  以脚本模式在ws运行

  3.7:Node.JS 如何自学一门新语言--Node.js

  (1)了解背景

    --百度百科 Node.JS  [事件驱动,非阻塞I/O 模型]

  (2)搭建开发环境,编写Hello World

  (3)数据类型

   

前端js数据类型

1:原始[基本]    number;string;boolean;null;undefined

2:引用/对象类型

    ES对象:Math;Date;RegExp;Object;Function;Error.....

    BOM/DOM对象:window;docuemnt;screen;event...

    自定义:{}

后端Node.js 数据类型

1:原始[基本]  number;string;boolean;null;undefined

2:引用/对象类型

    ES对象:Math;Date;RegExp;Object;Function;Error.....

    自定义:{}

  (4)变量和常量

  node js 提供了10几万·个专用对象 

运算符:逻辑运算·  算术运算  三目运算  位运算  副职运算  typeof  instanceof 

逻辑结构:循环结构  while do while  for    for()  选择结构  if else  switch case

声明一个保存五个学生的数学;

7.通用小程序

  nodejs 模块

modal模态框

model模型

module模块  是nodejs特有  是一个web项目中的功能分为不同的模块

每一个模块都是一个独立的构造函数  解释器都会自动为js文件添加如下代码

  (function(exports,require,module,__filename,__dirname){

expoirt{}用于声明向外部导出自己的成员  使用exports对象  对外导出或者公开自己的内部成员供其他成员使用 

require:fn用于导入其他模块  并且创建制定模块对象  创建一个模块的实力  模块名称就是模块的文件名

module:只带当前模块对象

你写的代码 

})

导出

const PI=Math.PI;

function getSize(r){

  var size=2*PI*r;

  return size;

}

function getPerimeter(r){

    var p=PI*r*r;

    return p;

}

//exports.PI=PI;

exports.getSize=getSize;

exports.Perimeter=getPerimeter;

导入

var m=require("./circle");

var c=m.getSize(2);

console.log(c);

var d=m.Perimeter(3);

console.log(d);

 

module指代当前对象

exports和modeule.exports

二者都可以用于指向外界导出自己的内部成员

真正导出数据modelu.export

node.js底层代码  exports=module.exports

如果导出一个完整的对象只能是m e    只导出属性 函数或变量  对象只能用me导出 

最好都用  module.exports     

编写数组模块

sum(),

module.exports.sum=sum;

module.exports.avg=avg;

var m=require("./arr");

!!!!!./必须要写  ./

exports不能导出对象   

3.8  nodejs 模块的分类

三种:1.官方提供  require(“模块名称”)

  2.第三方模块;

3.用户自定义的模块  nodule.exports  require()

3.9

day02

  通过nodejs搭建服务器

1. 引入nodejs核心模块  http

2. const http=require(“http”);

3. 创建一个服务器实例

4. let sever=http.createSever((req,res)=>{res.end(“it works.”);});

nodejs的全局模块  global  她的使用不需要引入

dirname  当前文件所在目录的绝对路径 

全局对象console 

全局对象  process    thread  线程执行的最小单位

process.kill()结束某一个软件的运行 

今天学习的内容

1:复习昨天的内容

2:首页

3:今天的目标

  3.1:node.js  模块分类(自定义模块)

  (1)官方提供模块

  (2)第三方模块,单独下载 www.npmjs.com

  (3)自定义模块

    #文件模块: 创建一个js文件,如 m3.js 导出需要公开数据

                其它模块 require("./m3");模块

    #目录模块:

      方式一:创建一个目录,假设名为 m4,其中创建名为index.js

            文件,导出需要公开的数据,其它模块引用

            require("./m4");

      方式二:创建一个目录,假设名为 m5,其中创建名为 5.js

            创建package.json main指定启动文件 5.js

      方式三:创建一个目录,必须名为 node_modules,

            其中再创建一个目录,假设 m6 ,其中创建

            package.json描述文件,其中声明main属性

            指定默认执行js文件,如 6.js ,其中导出需要

            公共数据,其它模块require("m6");

练习:使用第三种方式,创建二个目录模块circle;rectangle

都对外公开两个方法

size()      返回指定图形面积

perimeter();返回指定图形周长

最后在最外层模块,引入上述两个模块

circle.size(r) circle.perimeter(r)

r.size(w,h);  r.perimeter(w,h);

常见错误:

1: Error: Cannot find module './m4'  目录结构错误

  3.2:node.js  --- 特性(事件驱动; 非阻塞IO)

    php    阻塞  IO {有顺序;效率差}

    nodejs 非阻塞IO{无序;效率高}

  3.3:node.js  npm (Node Package Mangaer)

    node.js的第三方模块/包管理器,可以用于下载;更新;删除;

    维护包依赖关系的工具

    npm 工具默认www.npmjs.com网站下载所需的第三方模块

    包

    使用npm工具下载一个新的软件包

    npm install  包名    下载

    npm uninstall 包名    删除

    示例:

    nodejs 下载nodejs mysql驱动程序(第三方模块)

    1:查找 mysql 模块      www.npmjs.com    [mysql]

    2:npm install mysql

    淘宝:开发工具 cnpm

    cnpm install mysql    [99.99%]

  3.3:node.js  官方模块

  querystring  请求http中的查询字符串  var obj=qs.parse(str);将查询字符串转换为js对象      qs.stringfy(obj)将对秀昂转换为 js的字符串

eg:

//用;来加载querystring模块  官方提供好的模块要用常量  只是使用  不修改

    //global buffer不用require  优先级别较高

const qs=require("querystring");

//2。创建字符串

var str="uname=tom&ypwd=123&page=3";

//3将字符串转换为js对象

var obj=qs.parse(str);

console.log(obj);

//4对象=》字符串

var obj1={ uname: 'hah', ypwd: '12j3', page: '39' };

var str1 =qs.stringify(obj1);

console.log(str1);

  3.3:node.js  官方模块

url模块  用来解析一个http请求地址  获取其中各个不同部分

var obj=url.parse(str);url转对象

var obj=url.parse(str,true)将其中的查询字符串也转换为对象;

egconst  url=require("url");

var str="https://jd.com:443/ad/index?uname=hah&upwd=12345&page=50";

var obj2=url.parse(str,true);

console.log(obj2);

  3.3:node.js  官方模块

buffer  缓冲区  内存是速度介于 硬盘和cpu之间  本质上是内存的一块区域  用于暂时存储  数据  该区域  叫做缓存区 

1. 创建缓冲区  var buffer=Buffer.alloc(1024);

2. 创建一个数字数组的缓冲区

3.   var buffer1=Buffer.from([1,2,3,4])

4.   创建一个字符串

5. var buffer2=Buffer.from(“abc”)

6. 缓冲区  将缓冲区转换为字符串 

7. //创建  大小为2k的缓冲区  不用requier  优先级较高

    var buffer=Buffer.alloc(1024*2);

console.log(buffer.length);

//数组

  var buf1=Buffer.from([1,2,3,4]);

console.log(buf1);

//字符串

var buf2=Buffer.from("abhsjsj");

console.log(buf2);

//字符串缓冲区 转换为字符串

var str=buf2.toString();

console.log(str);

8. 

  3.3:node.js  官方模块

  文件读写模块  增删改查

1. 阻塞方案  有顺序 效率低

阻塞的向文件中  var data=fs.readFileSync(“文件名”);

写内容  fs.writeFileSync(文件名,内容) ;先将原有的内容删除新内容

//阻塞方式  读取文件  public/。。。。index.html  main.html

//加载fs模块

var fs=require("fs")

//创建两个变量  保存名称

var f1="./public/index.html";

var f2="./public/main.html";

console.log(1);

//读取第一个

var data=fs.readFileSync(f1);

console.log(data);

console.log(2);

//第二个

var data1=fs.readFileSync(f2);

console.log(data1)

文件写入用

var fs=require("fs");

//创建二个变量保存文件名 文件不存在自动创建  文件夹不存在就直接报错

var f1="./public/1.log";

var f2="./public/2.log";

//写入文件

console.log(1);

fs.writeFileSync(f1,new Date().toString);

console.log(2);

fs.writeFileSync(f2,new Date().toString);

console.log(3);

copy文件:先读取写入

var fs=require("fs");

var f1="./public/3.css";

var f2="./public/33.css";

//创建二个变量保存文件名 文件不存在自动创建  文件夹不存在就直接报错

var data=fs.readFileSync(f1);

fs.writeFileSync(f2,data);

console.log(data.toString());

fs.appendFileSync(f2,data);

文件中  追加内容  fs.appendFileSync(文件名 ,内容)

2. 非阻塞方案  无顺序  效率高

不好控制  fs.readFile(fileNmae,(err,data)=>{})  回掉函数文件读取之后  data就是内容  err是错误 

var fs=require("fs");

var f1="./public/3.css";

console.log(1);

fs.readFile(f1,(err,data)=>{

  if(err) throw err;

  console.log(data);

    console.log("读取结束");

})

console.log(2);

console.log(3);

console.log(4);

回调函数参数的顺序不能变;

写入fs.writeFile(文件名,(err)=>{

})追加fs.appendFile(文件名,(err)=>{

})

var fs=require("fs");

var f1="./public/4.css";

var f2="./public/44.css";

fs.readFile(f1,(err,data)=>{

    if(err) throw err;

    fs.writeFile(f2,data,(err)=>{if(err){throw err;}})

})

注意要在读取文件之中  处理写入文件   

http模块    给予http协议客户端程序一  服务器程序;

//创建服务器对象

//创建服务器对象

var http=require("http");

    var server=http.createServer();

//绑定端口  端口  1-65535;四个6不行  8888可以

server.listen(8888);

//注册事件  客户端请求事件、 req请求对象  res响应对象

server.on("request",(req,res)=>{

    console.log("nodejs服务器端接收到一个请求");

    //解析客户端发来的请求消息

    console.log(req.method);//请求方法

    console.log(req.url);//请求的url

    console.log(req.httpVersion);//http协议版本

    res.write("hello world");

    res.end();

})

//响应客户的消息    res.write()向客户端发送字符串  res.send()响应结束;

  作业1:大小小,小小大

  大鱼喂小鱼,金色光环特效,漂浮生物

//1:加载http模块

const http = require("http");

const fs = require("fs");

const url = require("url");

//2:创建http服务器

var server = http.createServer();

//3:绑定监听端口

server.listen(3000);

//4:注册事件 request

server.on("request",(req,res)=>{

    console.log("node.js 服务器端接收请请求");

    //解析客户端发来的请求消息

    //console.log(req.method); //GET POST

    //console.log(req.url);

    //console.log(req.httpVersion); //http协议

    var f=null;

    var obj = url.parse(req.url,true);

    if("/index.html" == obj.pathname){

      f="./index.html";

    }else if("/login.html" == obj.pathname){

        f="./login.html"

    }else {

      f="./404.html";

    }

    ///index.html

    //读取index.html文件内容返回给客户端

    fs.readFile(f,(err,data)=>{

        if(err)throw err;

        res.write(data);

        res.end();

    });

});

req 请求对象   

res.setHeader("Content-Type","text/html;charset=UTF-8");//设置字符集编码 

res.write("<h1>打飞机</h1>>");

res.end()

实现注册

const http = require("http");

const fs = require("fs");

const url = require("url");

//2:创建http服务器

var server = http.createServer();

//3:绑定监听端口

server.listen(3000);

//4:注册事件 request

server.on("request",(req,res)=>{

    console.log(res.url);

    console.log("node.js 服务器端接收请请求");

    var obj = url.parse(req.url,true);

    var f=null;

    if("/reg.html" == obj.pathname){

        f="./reg.html";

        fs.readFile(f,(err,data)=>{

            if(err)throw err;

            res.setHeader("Content-Type","text/html;charset=UTF-8");

            res.write(data);

            res.end();

        });

    }else if("/reg.do" == obj.pathname){

        var f1="./login.log";

      fs.appendFile(f1,("uname="+obj.query.uname+" "),(err)=>{

            if(err)throw err;

        })

        fs.appendFile(f1,("upwd="+obj.query.upwd+" "),(err)=>{

            if(err)throw err;

            res.setHeader("Content-Type","text/html;charset=UTF-8");

            res.write("注册·完成");

            res.end();

        })

        console.log("a");

    }

    ///index.html

    //读取index.html文件内容返回给客户端

});

数据库的种类

1. 关系型数据库

mysql 单表500万 100列行 opracle sql server  mysql一秒25次 

mogodb redis  20000以上 memcache  nosql 你不仅仅是sql

redis高并发    HBASE  1000万列

2. 非关系型的数据库

3.

sql语句的分类·

DDL定义语言 create drop alert

DML操作语句insert update、 delete

DQL查询语句 select

DCL 数据的控制语句 授权 恢复  回收权利 recover  grand‘ 

Nodejs 访问·mysql的服务器

:安装mysql‘的驱动程序

  为了精简nodejs的解释器  官方没有提供访问任何数据库相关的抹开I 必须要使用npm工具下载  npm。Js 

三部  创建数据库连接 

const mysql=require(“mysql:);

var conn=mysql.createConnection({})

3. 发送语句给哦数据库执行

4. conn.query(“sql”,(err,result){})

5. 关闭连接

6. const mysql=require("mysql");

var conn=mysql.createConnection({

    host:"127.0.0.1",

    user:"root",

    password:"",

    database:"xz",

    port:3306

});

console.log(conn);

//加载mysql模块

var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('kk',md5('123'))";

//创建sql语句  并发送

conn.query(sql,(err,result)=>{

    if(err){throw err}

    console.log(result);

    conn.end();

})

7. 判定添加成功的条件

8. if(result.affectedRows>0){

    console.log("添加成功");

}

mysql模块的使用  知道  网络中常见的攻击手段  sql注入  利用规则将危险代码  加入到sql语句里边 

占位符技术解决问题 

const mysql=require("mysql");

var conn=mysql.createConnection({

    host:"127.0.0.1",

    user:"root",

    password:"",

    database:"xz",

    port:3306

});

var uname="dingding";

var upwd=123456;

//console.log(conn);

//加载mysql模块

var sql=`SELECT COUNT(uid) as c FROM xz_user WHERE uname=? AND upwd=?`;

//var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('xianghong',md5('66666'))";

//创建sql语句  并发送

conn.query(sql,[uname,upwd],(err,result)=>{

    if(err){throw err}

    console.log(result[0].c);

if(result[0].c>0){

    console.log("成功");

}

else{

    console.log('失败');

}

})

创建链接池

const mysql=require("mysql");

const http=require("http");

const url=require("url");

const fs=require("fs");

var server = http.createServer();

var pool=mysql.createPool({

    host:"127.0.0.1",

    user:"root",

    password:"",

    database:"tmooc",

    port:3306,

    connectionLimit:5

});

//3:绑定监听端口

server.listen(3000);

//4:注册事件 request

server.on("request",(req,res)=>{

    res.setHeader("Content-Type", "text/html;charset=UTF-8");

    var obj=url.parse(req.url,true);

    var sname=obj.query.sname;

    var score=obj.query.score;

    var now=new Date();

    var path=obj.pathname;

    reg=/^[0-9a-z\u4e00-\u9fa5]{2,}$/i;

    if(path=="/add.do") {

        if (reg.test(sname) && reg.test(score)){

            var sql = "insert into stu values(null,?,?,?)";

        pool.query(sql, [sname, score, now], (err, result) => {

            if (err) {

                throw err

            }

            console.log(result);

            if (result.affectedRows > 0) {

                res.write("<h1>登记成功</h1>");

                res.end();

            }

            else {

                res.write("<h1>登记失败</h1>");

                res.end();

            }

        })

    }

    else{

            res.write("<h1>数据格式有误 请检查!</h1>");

            res.end();

        }

    }

    else if(path=="/add.html"){

      fs.readFile("./add.html",(err,data)=>{

          if(err){throw err}

          res.write(data);

          res.end();

      })

    }

})

  js将数组转换为  json字符串

var json=JSON .stringfy(result)

http开发效率有点低 

第三方模块 express

简化版本的http;

如果使用官方的http模块  但是这个模快是一个非常底层的模块  推荐使用  http模块进一步封装的 简化模块 

该模块的指甲哦顾问景象站http://www.expressjs.com.cn

1. 记载模块

2. var express=require(“express”)

3. var app=express();

4. 创建express对象

5. var server=tttp.CreateServer(app);

6. 创建服务器对象 

7. server.listen (3000);

8. 绑定监听端口 

9. app.get(“/add.html”,(req,res)=>{

10.   res.sendFile(“./add.html”);

11. })

nodejs  2.4

请求方法:

get请求  app.get  表示客户端想要获取服务器资源 

post请求  app.post/delete/put  表示客户带要上传 添加文件给客户端  相关数据在请求主体中

put更新指定的主体数据位于服务器上边 

delete表示客户端想要删除服务器上边的数据 

请求方法用于标明此次请求的目的 

浏览器什么方法发送请求:

get:地址栏中直接输入  ajax  表单提交  a标签  超链接 

  js的跳转  src  link-href 

post:ajax  表单

put:ajax

delete:ajax 

1.ie8  juery2以上不支持ie

2.热部署  nodejs支持热部署 

3.post POST    post尽量写大写 

取参数:

2.5参数 

get请求: 两种方式

1.查询字符串

get/user?uid=3&loc=bj  app.get(/user",(req,res)=>{

    req.query.uid;

query.loc

})

2.接受请求的参数 

get/book/js/60  app.get("/book/:name/:price"

req.params.name/price;

})

内部自动创建变量 一一对应 

express自动创建属性

res.json(result);

发送json  sendFile  发送页面

express实例

const express=require("express");

const http= require("http");

var app=express();

var server=http.createServer(app);

server.listen(3000);

const mysql = require("mysql");

//5:�������ӳ�

var pool = mysql.createPool({

    host:"127.0.0.1",

    user:"root",

    password:"",

    database:"tmooc",

    port:3306,

    connectionLimit:5

});

app.get("/stu/:sid",(req,res)=>{

  var sid= req.params.sid;

  //res.send(id);

var sql = "SELECT * FROM stu where sid=? ";

pool.query(sql,[sid],(err,result)=>{

    if(err)throw err;

res.json(result);

});

})

关于http协议:

请求是客户端发送给服务器的  响应是服务器发送给客户端的

发送一次请求  只会得到一次响应

1. 请求的详细个事

1. 请求起始行(请求方式:get没有请求主体 post有主体 put有主体  delete head表示客户端获取服务器上的资源只有响应头不要响应主体

,trace追踪请求路径  connection 测试连接  options保留以后使用

2.请求头:1.host.www..tmooc.cn 客户端告诉服务器此次请求的虚拟主机 2.connection:keep-alive  持久链接  3.cache-control缓存  4.user-agent客户端告诉服务器自己是什么类型  5.每次请求都会带上cookie  请求主体的描述  content-length:36  请求字节 

2响应其实行:

今天学习的内容

1:复习上一周重点;http协议

2:今天的目标

  2.1:nodejs--express--项目(学子商城)

  nodeadmin

            public---保存所有静态网页资源(html;css;image)

            app.js--项目的入口程序

            pool.js-连接池

  node_modules/mysql+express

  2.2:用户管理

  2.3:用户列表

    (1)用户分页显示

      app.js

      GET /users?pno=3&pageSize=10

      #参数 pno pageSize

      #sql

        SELECT count(uid) as c FROM xz_user  总记录数

        SELECT uid,uname,email,phone, avatar, user_name

        FROM xz_user

        LIMIT ?,?

      #json

        {pno:3,pageSize:10;pageCount:5,data:[]}

    常见错误:

      1: Error: Cannot find module 'express'

      当前目录或上级目中node_modules/没有express

      node.js/day04/ node_modules{mysq;express}

      2:

    (2)删除指定用户

    (3)更新指定用户信息[密码]

    (4)详细

  2.4:用户检索

  return;

➡️错误时使用      阻止程序执行     

非阻塞  设置progress来保证函数执行顺序

静态资源的中间件

app.user(express.static(“public”))  express

实例

http://127.0.0.12:3000/user_list.html

读取public下边的所有资源

pool.js 导出pool

const mysql = require("mysql");

//2:创建连接池对象

var pool = mysql.createPool({

    host:"127.0.0.1",

    user:"root",

    password:"",

    database:"xz",

    port:3306,

    connectionLimit:5

})

//3:输出对象

module.exports =  pool;

 

app.js  nodejs创建服务器

const pool = require("./pool");

//1:加载指定模块 http;express;pool

const http = require("http");

const express = require("express");

//2:创建express对象

var app = express();

//3:创建server对象

var server = http.createServer(app);

//4:绑定监听端口 3000

server.listen(8888);

//4.1制定静态资源的目录

    app.use(express.static("public"));

//功能一:用户分页显示

//GET /users    ?pno=3&pageSize=10

//    users.php  (req,res)=>{...}

app.get("/users",(req,res)=>{

    //5:接收请上请求

    //5.1:获取二个参数

    var pno = req.query.pno;

    var pageSize = req.query.pageSize;

    //5.2:默认值 1 pageSize  10

    //http=res.setHeadr()+res.write()+res.end();

    if(!pno){ pno = 1;}

    if(!pageSize){pageSize=10}

    //res.send(pno+"_"+pageSize);

    //5.3:正则表达式验证pno pageSize

    var reg = /^[0-9]{1,}$/;

    //res.setHeader+json+write+end

    if(!reg.test(pno)){

        res.json({code:-1,msg:"页码格式有误"});

        return;

    }

    if(!reg.test(pageSize)){

        res.json({code:-1,msg:"页大小格式有误"});

        return;

    }

    //结果对象

    var output = {pno:pno,pageSize:pageSize};

    var progress = 0;

    //5.4:创建二个sql  总记录数  当前页内容

    var sql = "SELECT count(uid) as c FROM xz_user";

    pool.query(sql,(err,result)=>{

        if(err)throw err;

        var pageCount = Math.ceil(result[0].c/pageSize);

        output.pageCount = pageCount;

        progress+=50;

        if(progress==100){

            res.json(output);

        }

    });

    //node.js 对占位符参数类型严格

    pno = parseInt(pno);

    pageSize = parseInt(pageSize);

    var offset = (pno-1)*pageSize;

    var sql = " SELECT uid,uname,phone,email";

        sql +=" ,avatar,user_name FROM xz_user";

        sql +=" LIMIT ?,?";

    pool.query(sql,[offset,pageSize],(err,result)=>{

        output.data = result;

        progress+=50;

        if(progress==100){

            res.json(output);

        }

    });

    //5.4:发送并且创建结果对象

});


推荐阅读更多精彩内容