在Node.js环境中执行JavaScript代码: 在命令行中输入: node js文件
fs.readFile(): 读取指定文件中的内容
fs.writeFile(): 向指定的文件中写入内容
导入fs模块: const fs = require(’fs’)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const fs = require('fs') fs.readFile("./test.txt", "utf8", function(err, dataStr){ console.log(err) console.log("-----") console.log(dataStr) })
const fs = require('fs') fs.readFile("./test.txt", "utf8", function(err, dataStr){ if(err){ return console.log("读取失败" + err.message) } console.log("读取成功" + dataStr) })
|
1 2 3 4 5 6 7 8
| const fs = require('fs') fs.writeFile("./test.txt", "hello world", function(err){ if(err){ return console.log("写入失败" + err.message) } console.log("写入成功") })
|
- path: Node.js提供的用于处理路径的模块
path.join(): 将多个路径片段拼接成一个完整的路径字符串
path.basename(): 将文件名从路径字符串中解析出来
1 2 3 4 5 6 7 8
| const fs = require('path')
const fpath = "/a/b/c/index.html" var fullname = path.basename(fpath) console.log(fullname) var nameWithoutExt = path.basename(fpath, ".html") console.log(nameWithoutExt)
|
- http: Node.js提供的用来创建web服务器的模块
通过http.createServer()可以把一台普通的电脑变成一台web服务器
服务器与普通电脑的区别: 服务器上安装了web服务器软件(IIS,
Apache等)
将本机当作服务器进行访问: 127.0.0.1 (对应的域名为localhost)
url在的80端口可以被省略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| const http = require("http")
const server = http.createServer()
server.on("request", function(req, res){ console.log("Someone visits our web server.") })
server.listen(8080, function(){ console.log("server is running at <http://127.0.0.1:8080>") })
server.on("request", (req) => { const str = "Your request url is ${req.url}, and request method is ${req.method}" console.log(str) })
server.on("request", (req, res) => { const str = "Your request url is ${req.url}, and request method is ${req.method}" res.end(str) })
server.on("request", (req, res) => { const str = "您请求的url地址是${req.url}, 请求的method类型为${req.method}" res.setHeader("Content-Type", "text/html; charset=utf-8") res.end(str) })
server.on("request", (req, res) => { const url = req.url let content = '<h1>404 Not found!</h1>' if(url === "/" || url === "/index/html"){ content = "<h1>首页</h1>" }else if(url === "/about.html"){ content = "<h1>关于页面</h1>" } res.setHeader("Content-Type", "text/html; charset=utf-8") res.end(content) })
const custom = require("./custom.js")
|
模块作用域: 可避免全局变量污染的问题
module: 在每个.js自定义模块中都有一个module对象,
存储了与当前模块有关的信息
外界用require()方法导入自定义模块时,
得到的就是module.exports所指向的对象
在一个自定义模块中, 默认情况下, module.exports = {}
1 2 3 4 5 6 7
| module.exports.username = "zhangsan" module.exports.sayHello = function(){ console.log("Hello!") } const age = 20 module.exports.age = age
|
exports: 默认情况下,
exports和module.exports指向的是同一个对象(代码简化)
包共享平台:
https://www.npmjs.com(搜索)
https://registry.npmjs.org(下载)
包管理工具:
Node Package Manager(npm包管理工具), 随Node.js的安装一并安装
用npm安装包: npm install 包完整名称 / npm i 包完整名称
初次装包完成后,
项目文件夹下会出现node_modules文件夹和package-lock.json配置文件;
node_modules文件夹用于存放所有已安装到项目中的包;
package-lock.json配置文件用于记录node_modules目录下每一个包的下载信息(包名,
版本号, 下载地址等)
1 2 3
| npm i moment npm i moment@2.22.2
|
包管理配置文件(package.json): 位于项目根目录,
记录与项目有关的一些配置信息,
从而方便在剔除node_modules目录之后在团队成员之间共享项目源代码
注: 在项目开发中, 把node_modules文件夹添加到.gitignore忽略文件中
1 2 3 4 5 6 7 8 9
| npm init -y
npm install
npm uninstall moment
|
对于只在项目开发阶段用到、项目上线之后不会用到的包,
应该把这些包记录到devDependencies中
模块在第一次加载后会被缓存, 然后优先从缓存中加载
内置模块(Node.js官方提供的模块)的加载优先级最高
加载自定义模块时, 必须指定以./或../开头的路径标识符
第三方模块从node_modules文件夹中进行加载,
如果没有找到对应的第三方模块, 则移动到再上一层父目录中进行加载,
直到文件系统的根目录
在被加载的目录中查找package.json文件, 并寻找main属性,
作为require加载的入口
若没有package.json文件或main入口不存在或无法解析,
则尝试加载目录下的index.js文件; 若都不存在, 则在终端打印错误信息
- Express: 基于http内置模块进一步封装出来的, 效率更高,
可以方便、快速地创建web网站服务器或API接口服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| npm i express@4.17.2
const express = require("express")
const app = express()
app.listen(80, () => { console.log("express server is running at <http://127.0.0.1>") })
app.get("请求的url地址", function(req, res) {})
app.post("请求的url地址", function(req, res) {})
app.get("/user", function(req, res) { res.send({name: "zhangsan", age: 20}) })
app.post("/user", function(req, res) { res.send("请求成功") })
app.get("/", function(req, res) { console.log(req.query) res.send(req.query) })
app.get("/user/:id/:name", function(req, res) { console.log(req.params) res.send(req.params) })
app.use(express.static("public"))
app.use(express.static("public")) app.use(express.static("files"))
app.use("public", express.static("public"))
|
- nodemon: 监听项目文件的变动, 当代码被修改后会自动重启项目,
不需要手动close
- Express中的路由: 客户端请求与服务器处理函数之间的映射关系
路由有3部分组成: 请求的类型, 请求的url地址, 处理函数;
若请求的类型、请求的url地址能够匹配成功,
则Express会将这次请求交给对应的处理函数来处理
- 模块化路由: 将路由抽离为单独的模块, 而不是直接挂载到app上
创建路由模块对应的.js文件; 调用express.Router()函数创建路由对象;
向路由对象上挂载具体的路由; 使用module.exports向外共享路由对象;
使用app.use()函数注册路由模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| var express = require("express") var router = express.Router()
router.get("/user/list", function(req, res){ res.send("Get user list.") })
router.post("/user/list", function(req, res){ res.send("Add new user.") })
module.exports = router ---------------------------------------------- const express = require("express") const app = express() const router = require("./myrouter.js") app.use(router)
app.listen(80, () => { console.log("<http://127.0.0.1>") })
const express = require("express") const app = express() const mw = function(req, res, next){ console.log("最简单的中间件函数") next() }
app.listen(80, () => { console.log("<http://127.0.0.1>") })
app.use(function(req, res, next){ console.log("调用了第1个全局中间件") next() }) app.use(function(req, res, next){ console.log("调用了第2个全局中间件") next() })
app.get("/", mw, function(req, res){ res.send("Home page.") })
app.get("/", mw1, mw2, (req, res) => {res.send("Home page.")}) app.get("/", [mw1, mw2], (req, res) => {res.send("Home page.")})
app.get("/", function(req, res){ throw new Error("发生错误!") res.send("Home page.") })
app.use(function(err, req, res, next){ console.log("发生错误:" + err.message) res.send("error" + err.message) })
express.static: 快速托管静态资源的内置中间件 express.json: 解析JSON格式的请求体数据 express.urlencoded: 解析URL-encoded格式的请求体数据 app.use(express.json()) app.use(express.urlencoded({extended: false})) app.post("/user", (req, res) => {
console.log(req.body) res.send("ok") })
npm install body-parser const parser = require("body-parser") app.use(parser.urlencoded({extended: false})) app.post("/user", (req, res) => { console.log(req.body) res.send("ok") })
const qs = require("querystring") app.use((req, res, next) => { let str = "" req.on("data", (chunk) => { str += chunk }) req.on("end", () => { console.log(str) const body = qs.parse(str) console.log(body) }) }) -------------------------------------------------- const bodyParser = (req, res, next) => { let str = "" req.on("data", (chunk) => { str += chunk }) req.on("end", () => { console.log(str) const body = qs.parse(str) console.log(body) }) } module.exports = bodyParser
|
- cors: Express的一个第三方中间件,
可以解决跨域问题(协议或域名或端口号不同)
只需在服务器端配置, 客户端无需做任何额外配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| npm install cors const cors = require("cors") app.use(cors())
... <body> <button id="btnGET">GET</button> <button id="btnPOST">POST</button> <button id="btnJSONP">JSONP</button> <script> $(function(){ $("#btnGET").on("click", function(){ $.ajax({ type: "GET", url: "<http://127.0.0.1/api/get>", data: {name: "zhangsan", age: 20}, success: function(res){ console.log(res) }, }) }) $("#btnPOST").on("click", function(){ $.ajax({ type: "POST", url: "<http://127.0.0.1/api/post>", data: {bookname: "test1", author: "test2"}, success: function(res){ console.log(res) }, }) }) $("#btnJSONP").on("click", function(){ $.ajax({ type: "GET", url: "<http://127.0.0.1/api/jsonp>", dataType: "jsonp", success: function(res){ console.log(res) }, }) }) }) </script> </body> ...
res.setHeader("Access-Control-Allow-Origin", "<http://itcast.cn>") res.setHeader("Access-Control-Allow-Origin", "*")
res.setHeader("Access-Control-Allow-Methods", "GET", "POST", "HEAD", "PUT", "DELETE") res.setHeader("Access-Control-Allow-Methods", "*")
|