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.user
server.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 = 3000
app.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