当前位置: 首页 > news >正文

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

为对象设置事件

  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.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

http://www.lryc.cn/news/577067.html

相关文章:

  • 用户行为序列建模(篇八)-【阿里】DIEN
  • ROS常用的路径规划算法介绍
  • 在Linux系统中部署Java项目
  • 爪形行列式
  • 图书管理系统练习项目源码-前后端分离-使用node.js来做后端开发
  • Linux中ssh无法使用配置的环境变量,ssh(非登录环境)环境变量和登录环境变量不同步问题
  • python中多线程:线程插队方法join详解、线程停止、通过变量来让线程停止
  • 电子计数跳绳原型
  • StarRocks 3.5 新特性解读:Snapshot 快照恢复、大导入性能全面升级、分区管理更智能
  • 左神算法之螺旋打印
  • vue使用Element Plus UI框架
  • Modbus 报文结构与 CRC 校验实战指南(一)
  • 设计模式(五)
  • Java面试宝典:基础五
  • pyhton基础【18】面向对象基础一
  • LRU缓存设计与实现详解
  • XWPFDocument导出word文件
  • 使用component封装组件和h函数的用法
  • 71. 简化路径 —day94
  • Utils系列之内存池(Fixed size)
  • Elasticsearch 集群升级实战指引—7.x 升级到 8.x
  • 【C++】C++中的友元函数和友元类
  • Prompt Depth Anything:以提示方式驱动的Depth Anything用于实现4K分辨率下的精确米制深度估计
  • 大事件项目记录12-文章管理接口开发-总
  • 【学习】《算法图解》第八章学习笔记:平衡树
  • springboot校园新闻网站
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(三)- 职位数据统计分析
  • 二叉树找到下一个中序遍历节点的思路
  • MATLAB仿真:经过大气湍流的涡旋光束的光斑漂移
  • 消息队列:Redis Stream到RabbitMQ的转换