node.js框架

一、简介

浏览器可以解析js的原因

浏览器使用js解析引擎进行解析
**记忆:Chrome是V8引擎

NodeJS中的API模块

例如:fs:文件系统模块、path:路径模块、http:WEB服务器模块
但是不包含DOM和BOM等浏览器API,所以**Node中无法操作DOM和BOM**

二、准备前期

安装Node.js

打开官网下载最新版本

检测方法

打开cmd命令行,输入node -v可以查看安装的版本号

三、包管理工具npm

安装文件

npm install 包名;
npm install 包名@指定版本

eg:时间格式化

//首先在vscode终端,npm install moment安装时间格式化包
const moment = require("moment");//导入moment模块
const time = moment().format("YYYY-MM-DD HH:mm:ss");//HH大写是24小时制,hh是12小时制
console.log(time);

四、Node.js的模块

(1)fs文件系统模块

fs模块是Node.js专门操作文件的模块
readFile读取文件

//语法:fs.readFile(path,[,options],callback)
//                  路径,  设置     回调函数
//eg:
const fs = require("fs");//引入fs模块
fs.readFile("./01.txt","utf8",       function(err,data){console.log(data)});
//读取文件     文件路径   字符集        回调函数 参数1,参数2
//如果读取成功,err值为null。如果读取失败,err的值为错误读写,data的值为undefined

判断文件是否读取成功

const fs = require("fs");//引入fs模块
fs.readFile("./02.txt","utf8",function(err,data){if(err){//如果读取失败console.log("文件读取失败"+err.message);}console.log(data);
})

writeFile写入文件

//语法:fs.writeFile(file,data[,options],callback)
//                  文件  数据   配置      回调函数
//eg:
const fs=require("fs");//导入fs模块
fs.writeFile("./01.txt","我是添加内容",       function(err,data){console.log(data)});
//写入文件     文件路径     添加内容            回调函数 参数1,参数2

判断文件是否写入成功

const fs=require("fs");//导入fs模块
fs.writeFile("./01.txt","我是添加内容",function(err,data){if(err){console.log("文件写入失败"+err.message);}console.log("文件写入成功");
});

__dirname自动获取文件所在的目录位置

cosnt fs = require("fs")//导入fs模块
fs.readFile(__dirname + "/01.txt","utf8",function(err,data){if(err){console.log("文件读取失败"+err.message);}console.log("文件读取成功");
})

(2)path路径模块

path.join()连接路径

const fs = require("fs");//导入fs模块
const path = require("path");//导入path模块
fs.readFile(path.join(__dirname+"./01.txt"),"utf8",function(err,data){。。。
})

path.basename()获取文件名

const path = require("path");//导入path模块
const str = "code/text/01.txt";//假设code文件夹下的text文件夹下有个01.txt文件
console.log(path.basename(str));//01.txt    获取完整的文件名
console.log(path.basename(str,".txt"));//01 获取排除后缀名以后的文件名

path.extname获取文件后缀名

const path = require("path");//导入path模块
const str = "code/text/01.txt";//假设code文件夹下的text文件夹下有个01.txt文件
console.log(path.extname(str));//.txt  获取文件的后缀

(3)http模块

http模块使用方法

const http = require("http");//导入http模块
const server = http.createServer();//创建服务实例
server.on("request",(req,res)=>{console.log("请求服务器了");
});
server.listen(80,()=>{console.log("server is listen:127.0.0.1");
});

req 捕获到客户端请求到服务端的请求对象
测试get请求,req.url:可以获取客户端请求的地址 req.method:可以获取客户端请求的方式

const http = require("http");//导入http模块
const server = http.createServer();//创建服务实例
server.on("request",(req,res)=>{console.log(req.url);//获取请求地址console.log(req.method);//获取请求方式
});
server.listen(80,()=>{console.log("server is listen:127.0.0.1");
})

测试get请求,利用postman工具(post/get都能测)
res 响应的内容

const http = require("http");//导入http模块
const server = http.createServer();//创建服务实例
server.on("request",(req,res)=>{res.end(req.url+req.method);//客户端响应内容
});
server.listen(80,()=>{console.log("server is listen:127.0.0.1");
});

解决相应乱码问题

//在请求中添加请求头
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {**  res.setHeader("Content-Type", "text/html;charset=utf-8");**res.end(req.url + req.method);
});
server.listen(80, () => {.....
});

如何让不同地址相应不同内容

//添加if判断
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {let content = "";if (req.url == "/" || req.url == "/index.html") {content = "<h1>首页内容</h1>";} else if (req.url == "/detail.html") {content = "<h1>详情页内容</h1>";} else {content = "<h1>你访问的页面不存在</h1>";}res.setHeader("Content-Type", "text/html;charset=utf-8");res.end(content);
});
server.listen(80, () => {console.log("server is listen:127.0.0.1");
});

(4)express搭建web服务器框架

express使用

//首先npm install express@版本号
const express = require("express");//导入express框架
const app = express();//搭建web服务器
app.listen(80,()=>{console.log("服务已经启动127.0.0.1");
});

测试express的get请求

const experess = require("express");//导入express模块
const app = express();//搭建web服务器
// 发送get请求
app.get("/user", (req, res) => {res.send({ code: 200, msg: "响应get请求成功", status: 1 });
});
app.listen(80, () => {console.log("服务已经启动127.0.0.1");
});

测试express的post请求

//通过postman测试

获取get请求参数
req.query可以获取get请求获取参数

app.get("/user", (req, res) => {let msg = req.query;res.send({ code: 200, msg: msg, status: 1 });
});

获取动态参数

// 发送get请求
app.get("/user/:id/:name", (req, res) => {let msg = req.params;res.send({ code: 200, msg: msg, status: 1 });
});

获取post请求的参数
传递json格式

const express = require("express");
const app = express();
// 使用中间件把数据转换成json格式,后面req.body才能正常接收到
app.use(express.json());
app.post("/user/add", (req, res) => {const body = req.body; //获取post请求的数据console.log(body);res.send("接收到post请求数据" + body);
});
app.listen("80", () => {console.log("服务已经启动了 127.0.0.1");
});

获取url-encode提交的数据

const express = require("express");
const app = express();
// 使用中间件把数据转换成json格式,后面req.body才能正常接收到
// app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.post("/user/add", (req, res) => {const body = req.body; //获取post请求的数据//console.log(body);res.send(body);
});
app.listen("80", () => {console.log("服务已经启动了 127.0.0.1");
});

express.satic()静态资源

const express = require("express");
const app = express();
//设置静态资源目录
app.use(express.static("./test"));app.listen(80, () => {console.log("服务已经启动127.0.0.1");
});
//浏览器如下访问:http://127.0.0.1/public/images/1.jpg

五、nodemon工具

  npm install nodemon -g安装nodemon工具nodemon xx.js会用nodemon工具打开js文件,自动监听代码的变化

六、路由

定义:是客户端的请求和服务器处理函数之间的映射关系。

app.get("/user", (req, res) => {let msg = req.params;res.send({ code: 200, msg: msg, status: 1 });
});app.get("/product", (req, res) => {let msg = req.params;res.send({ code: 200, msg: msg, status: 1 });
});

路由模块

//router.js文件
const express = require("express");
const router = express.Router(); //创建路由对象
// 挂载路由
router.get("/product/list", (req, res) => {res.send("实现商品列表显示功能");
});
router.post("/product/add", (req, res) => {res.send("实现商品添加功能");
});
module.exports = router; //导出路由对象
//01.js
const express = require("express");
const app = express();
// 导入路由模块
const router = require("./router");
// 注册路由
app.use(router);
// 启动服务
app.listen("80", () => {console.log("服务已经启动 http://127.0.0.1");
});

路由前缀

const express = require("express");
const app = express();
// 导入路由模块
const router = require("./router");
// 注册有前缀的路由
app.use("/api", router);
// 启动服务
app.listen("80", () => {console.log("服务已经启动 http://127.0.0.1");
});

七、中间件

定义:客户端把请求发送给服务端以后要经过层次的中间件的处理,最终才能获得响应结果。
全局中间件

const express = require("express");
const app = express();// 设置全局中间件
app.use((req, res, next) => {let into = "测试消息";req.dd = into;next();
});
app.get("/product", (req, res) => {res.send("get请求" + req.dd);
});
app.post("/product", (req, res) => {res.send("post请求" + req.dd);
});
// 启动服务
app.listen("80", () => {console.log("服务已经启动 http://127.0.0.1");
});
//多个中间件是共享req和res对象的,所以在上层的中间件之间设置参数属性,在后面的中间件就能获取到挂载到req对象上面的参数。

局部中间件

//如果路由中有的需要中间件,有的不需要
const express = require("express");
const app = express(); //创建服务对象// 定义局部中间件
const middle = (req, res, next) => {console.log("局部中间件");next();
};
app.get("/product/list", middle, (req, res) => {res.send("展示商品列表");
});app.post("/product/add", (req, res) => {res.send("添加商品列表");
});
app.listen("80", () => {console.log("服务已经启动了 127.0.0.1");
});
//1、写中间件必须添加next()函数放行
//2、间件函数可以挂载到app上,也可以定义在局部
//3、间件必须在路由之前写

第三方中间件body-parser

//先安装 npm install body-parser
require("body-parser")
app.use(parser.urlencoded({extended:false}))
//代码示例如下
const express = require("express");
const app = express();
// 使用中间件把数据转换成json格式,后面req.body才能正常接收到
// app.use(express.json());
const parser = require("body-parser");
app.use(parser.urlencoded({ extended: false }));app.post("/user/add", (req, res) => {const body = req.body; //获取post请求的数据console.log(body);res.send(body);
});
app.listen("80", () => {console.log("服务已经启动了 127.0.0.1");
});

八、node连库

创建连接

//先安装mysql服务npm install mysql
const mysql = require("mysql");
const db = mysql.createPool({host: "localhost",user: "root",password: "root",database: "test"
});
console.log(db);
db.query("select * from users", (err, results) => {if (err) {return err.message;}console.log(results);
});

const mysql = require("mysql");
const db = mysql.createPool({host: "localhost",user: "root",password: "root",database: "test"
});
console.log(db);
let user = { username: "武伟", password: "666" };
let sql = "insert into users (id,username,password) values (NULL,?,?)";
db.query(sql, [user.username, user.password], (err, results) => {if (err) {return err.message;}console.log(results);if (results.affectedRows == 1) {console.log("插入成功");}
});

// 演示设置静态资源
// 用experss框架搭建web服务
const express = require("express"); //1、引入框架
const app = express(); //2.创建服务实例
// 设置静态资源模板
app.use(express.static("./test"));// 可以根据不同的请求做不同的处理   请求方式、请求地址、响应数据
app.get("/product", (req, res) => {res.send("hello");
});// 3、启动服务
app.listen("80", () => {console.log("服务已经启动了 127.0.0.1");
});

const mysql = require("mysql");
const db = mysql.createPool({host: "localhost",user: "root",password: "root",database: "test"
});let user = { id: 11, username: "new武伟", password: "777" }; //要更新的数据
let sql = "update users set username=?,password=? where id=?";
db.query(sql, [user.username, user.password, user.id], (err, results) => {if (err) {return err.message;}console.log(results);if (results.affectedRows == 1) {console.log("更新成功");}
});

九、跨域问题以及解决方法

什么是跨域

  浏览器出于安全考虑要求同一个域名下的html页面可以对同一个域名下面的脚本发出请求,否则就会报下面的错误。'Access_Control-Allow-Origin'当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

解决方法

//安装cors插件npm install cors
const cors = require("cors");//导入cors包
app.use(cors())//注册使用这个中间件

node.js菜系食用方法相关推荐

  1. Node.js与Sails~方法拦截器policies

    policies sails的方法拦截器类似于.net mvc里的Filter,即它可以作用在controller的action上,在服务器响应指定action之前,对这个action进行拦截,先执行 ...

  2. zabbix node.js mysql_Zabbix添加Node.js监控的方法

    目前网上已有 pm2-zabbix 工具可以实现Zabbix对Node.js的监控报警,Github地址. 特征: 自动发现通过PM2管理的Node.js进程. 报告Nodes.js进程状态.CPU占 ...

  3. Node.js 调用 C++ 方法 / C++ Addons 详解

    最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用.于是花点时间总结一下. Android开发中Java 调用C++的部分叫JNI, ...

  4. Node.js 常用Mongoose方法

    Node.js 手册查询-Mongoose 方法 一.Schema 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力.可以说是数据属性模型(传统意义的表结构 ...

  5. 子进程会继承父进程的哪些内容_【学习教程】Node.js创建子进程方法

    来源 | https://github.com/CommanderXL/biu-blog/issues/25 exec 其中exec可用于在指定的shell当中执行命令.不同参数间使用空格隔开,可用于 ...

  6. node.js 字符串拆分方法总结

    接口测试中Postman是经常会用到的工具之一,因此要了解一些简单的Node.js语言. 项目中用到的字符串拆分的一些方法总结如下. 1.slice(); 对象可以为Array或String slic ...

  7. 树莓派开机运行node.js脚本的方法

    http://gyzx.swjtu.edu.cn/icsites/devzone/node/352 一.配置Raspberry Pi无线网络. 插上无线网卡 sudo nano /etc/wpa_su ...

  8. node.js从零开始搭建服务器(详细1)

    首先下载安装node.js 本文从基本开始搭建,(详细1)步骤不出错的情况下基本实现接口配置,请求传参与接收. 新建一个文件夹,命名为serve,在该文件下创建app.js子文件,此为服务器入口 内容 ...

  9. Node.js模块系统

    2019独角兽企业重金招聘Python工程师标准>>> 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分 ...

最新文章

  1. yii 操作cookie
  2. java开发环境配置环境变量_3. Java开发环境的搭建:安装JDK,配置环境变量
  3. Window2008R2安装Telnet客户端
  4. 关于iptables
  5. bind blz mysql_MySQ DBAL重点剖析课程 企业级MySQL系统安全与DBA运维日常事务管理 运维DBA必备宝典...
  6. python中集合运算_入门 | 一文带你了解Python集合与基本的集合运算
  7. 1054. The Dominant Color (20)
  8. “数学不好,干啥都不行!”骨灰级程序员:别再瞎努力了!
  9. ElasticSearch 集群监控
  10. python基础学习笔记(七)
  11. qq的 html页面布局,wep.qq webqq网页版QQ怎么登陆
  12. 单极性非归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真
  13. 45% 72% 100sRGB 色域
  14. 应聘总经理的答卷,供大家打分!(一)
  15. Oracle账号 Oracle官网登录下载资源账号密码共享
  16. 97. Interleaving String
  17. aix 下创建vg和lv
  18. 匹配的通配符很全面,但无法找到元素mvc:annotation-driven的声明
  19. linux dns chroot,chroot环境下dns解析不好用
  20. linux怎么配置网卡实训报告,网络配置实验心得5

热门文章

  1. DALLE2-文本图像生成
  2. 对VR的初步了解及unity的简单操作
  3. easyui datagrid 扩展方法
  4. java richtextbox_将超链接设置为RichTextBox
  5. android wifi直连 代码,Android WiFi直连并互发图片(示例代码)
  6. IT程序员必备google浏览器Chrome插件_最优推荐_筛选N次
  7. 2021年计算机保研夏令营(从双非到南大软件学院)
  8. 端午安康,使用祝福话语生成词云吧
  9. 父亲节写给父母:电子通信为什么要转行计算机软件
  10. js后退按钮事件触发