node js入门,包含express,npm管理

发布于:2025-07-03 ⋅ 阅读:(25) ⋅ 点赞:(0)

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")

为对象设置事件

  1. 传统版本
// 下面的方法为对象添加事件
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")
  1. 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("服务启动成功")

模块化写法

  1. data.js文件
{
	"name":"jack",
	"age": 20
}
  1. 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
}


  1. 调用文件index.js
var server = require("./server.js")

server.startServer()

路由

本代码基于上面的http模块化写法

  1. 创建一个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>
  1. 修改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
}


路由重构

  1. 创建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
}
  1. 创建route.js
function route(handle,pathname, response) {
	if (typeof handle[pathname] === 'function') {
		handle[pathname](response)
	} else {
		// 错误404页面,省略
	}
}

module.exports=route
  1. 修改 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
}


  1. 修改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


网站公告

今日签到

点亮在社区的每一天
去签到