node js入门,包含express,npm管理
Node js 全局对象
- __dirname
- __filename
回调函数
// 函数回调function say() {console.log("say")
}// 带参数
var bye = function(name) {console.log(name + ":bye")
}function call_fun(callback, param){callback(param)
}// 运行回调方法
call_fun(say)
// 运行带参数的回调方法
call_fun(bye, "jackie")// 写法2: 常见的传参方式
call_fun(function(name) {console.log(name + ": call_fun_2")
}, "marry")
2. 模块化
这里有个代码utils.js, 用于提供接口
// 测试模块化, 暴露接口var adder = function (a, b) {return `a + b = ${a + b}`
}
var counter = function(arr) {return "the array length is : " + arr.length
}//console.log(adder(3,4))
//console.log(counter([1,2,3,4,5]))// 导出接口
// 调用方式 const adder = require("./utils.js"); console.log(adder(2,3))
module.exports = adder// 这种方式默认导出一个对象, 使用时 使用 const utils = require('./utils.js'); utils.adder(1,2)
module.exports.adder = adder
module.exports.counter = counter// 大多使用这种
module.exports = {adder: adder,counter, // 名称一样可以简写multiply: function(a, b) {return 'a * b = ' + a*b}}
这里有个调用方index.js
// 测试模块化,调用接口
// 导入
//const adder = require("./utils.js")//console.log(adder(2,3))const utils = require("./utils.js")console.log(utils.adder(2,3))
console.log(utils.multiply(2,3))
3. 事件 event
// 1. import events
var events = require("events")// 2. create event
var myEmitter = new events.EventEmitter()// 3. set event listener
myEmitter.on("someEvent", function(param){console.log("event has been triggered, param"+ param)
})// 4.trigger event
myEmitter.emit("someEvent", "jackie")
为对象设置事件
- 传统版本
// 下面的方法为对象添加事件
var events = require("events")
var util = require("util")var Person = function(name) {this.name = name
}// 继承事件,方法过时TODO
util.inherits(Person, events.EventEmitter)var jackie = new Person("jackie")
var tony = new Person("tony")var persons = [jackie, tony]//循环 设置事件监听器
persons.forEach(function(item){item.on("say", function(message){console.log(item.name + " say: " + message)})
})// 触发事件
jackie.emit("say", "Hi")
tony.emit("say", "Hello, I'm tony")
- ES6 版本
// 本程序为ES6版本
var Events = require("events")class Person extends Events{constructor(name){super()this.name = name}
}var jackie = new Person("jackie")
var tony = new Person("tony")var persons = [jackie, tony]//循环 设置事件监听器
persons.forEach(function(item){item.on("say", function(message){console.log(item.name + " say: " + message)})
})// 触发事件
jackie.emit("say", "Hi")
tony.emit("say", "Hello, I'm tony")
略过内容
- 文件读写
- 管道流
http请求服务器
最基本写法
var http = require("http")var server = http.createServer(function(req, res){console.log("request...")res.writeHead(200,{// 纯文本、JSON、HTML均可设置"content-Type": "text/plain"})res.end("hello nodejs web result")
})server.listen(8080,"0.0.0.0")console.log("服务启动成功")
模块化写法
- data.js文件
{"name":"jack","age": 20
}
- server.js文件
var http = require("http")
var data = require("./data.json")function startServer() {var server = http.createServer(function(req, res){console.log("request...")res.writeHead(200,{// 纯文本、JSON、HTML均可设置"Content-Type": "application/json"})res.end(JSON.stringify(data))})server.listen(8080,"0.0.0.0")console.log("服务启动成功")
}module.exports = {startServer
}
- 调用文件index.js
var server = require("./server.js")server.startServer()
路由
本代码基于上面的http模块化写法
- 创建一个home.html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>我的网页</title>
</head>
<body><h1>你好,Home!</h1><p>这是一个最基本的HTML页面。</p>
</body>
</html>
- 修改server.js代码
var http = require("http")
var data = require("./data.json")
// 引入文件操作流
var fs = require("fs")function startServer() {var server = http.createServer(function(req, res){console.log("request...")//res.writeHead(200,{// 纯文本、JSON、HTML均可设置//"Content-Type": "application/json"//})//res.end(JSON.stringify(data))//下面是路由写法if (req.url ==="/" || req.url === "") {// 返回一个home页面res.writeHead(200, {"Content-Type": "text/html"})// 读取文件流,并以管道输出fs.createReadStream(__dirname + "/home.html", "utf-8").pipe(res)} else if (req.url === "/api/user") {res.writeHead(200, {"Content-Type": "application/json"})res.end(JSON.stringify(data))} else {// 404 页面,省略}})server.listen(8080,"0.0.0.0")console.log("服务启动成功")
}module.exports = {startServer
}
路由重构
- 创建handle.js
var fs = require("fs")
var data = require("./data.json")function home(response) {response.writeHead(200, {"Content-Type": "text/html"})// 读取文件流,并以管道输出fs.createReadStream(__dirname + "/home.html", "utf-8").pipe(response)
}function user(response) {response.writeHead(200, {"Content-Type": "application/json"})response.end(JSON.stringify(data))
}// 暴露
module.exports={home,user
}
- 创建route.js
function route(handle,pathname, response) {if (typeof handle[pathname] === 'function') {handle[pathname](response)} else {// 错误404页面,省略}
}module.exports=route
- 修改 server.js
var http = require("http")function startServer(route, handle) {var server = http.createServer(function(req, res){console.log("request...")route(handle, req.url, res)})server.listen(8080,"0.0.0.0")console.log("服务启动成功")
}module.exports = {startServer
}
- 修改index.js
var server = require("./server.js")
var handler = require("./handler.js")
var route = require("./route.js")var handle = {}handle["/"] = handler.home
handle["/home"] = handler.home
handle["/api/user"] = handler.userserver.startServer(route, handle)
GET/POST请求参数解析
省略
npm 相关
基本使用
npm -i express
npm install express
npm init
在指定的目录执行npm init命令后,
npm init
按照要求填写信息后会自动生成文件
- package-lock.json
- package.json
以后使用npm按照第三方依赖后package.json会自动报错依赖的信息
其他协同者仅需执行npm install
命令会自动下载相关的依赖
package.js 中script的作用
使用不同的参数管理不同的环境等。
npm run dev
"scripts": {"build": "tsc", // 调用 TypeScript 编译器// "build": "react-scripts build", // 内置 Webpack 打包"dev": "node index.js" // 运行编译后的代码}
npmmon 自动检测文件变化
本地修改代码后不需要手动重启服务
其他省略
express
官方指引
https://www.expressjs.com.cn/
入门:
$ npm install express
const express = require('express')
const app = express()
const port = 3000app.get('/', (req, res) => {res.send('Hello World!')
})app.listen(port, () => {console.log(`Example app listening on port ${port}`)
})
express-generator
通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。
详见官网:https://www.expressjs.com.cn/starter/generator.html
TODO
nodejs 中文官网:https://nodejs.p2hp.com/learn#google_vignette
参考:https://www.bilibili.com/video/BV1Up421D7kz