一、入门案例
const os = require('os');
// 获取系统的cpu的信息
const cpus = os.cpus(); // 获取当前系统的cpu的数量
console.log(cpus.length);
// 获取内存的信息
const total = os.totalmem(); // bytes
console.log(total/1024/1024/1024); // GB
// 剩余内存
const free = os.freemem();
console.log(free/1024/1024/1024); // GB
// web服务
// ajax -> api -> web server(nodejs)
const http = require('http');
const server = http.createServer((req,res)=>{
res.end('hello');
});
server.listen(3000,'127.0.0.1',()=>{
console.log('服务启动成功!');
});
二、nodemon(热加载)
开发时,修改代码后,需要频繁重启项目。nodemon配置热加载,解决了重复启动的问题。
const http = require('http');
const server = http.createServer((req,res)=>{
res.end('hello');
});
server.listen(3000,'127.0.0.1',()=>{
console.log('服务启动成功!');
});
{
"name": "admin-api-demo",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js", # 添加此句 可用 npm start启动项目
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"multer": "^1.4.2",
"mysql": "^2.18.1"
}
}
1、安装配置
# -D:安装在开发环境
npm install nodemon -D
# 修改 package.json 中 "start": "node app.js" 改为
"start": "nodemon app.js"
# 重启命令(nodemon也可自动重启,因为配置了监听 watching:*.*)
rs
2、配置nodemon.json
因为项目中不需要监听全部文件,避免没必要的重启,所以配置nodemon.json。
指定要监听的目录,只有该目录下的文件被改动,nodemon才会重启项目。
{
"watch":["./src/**/*.*"]
}
三、nrm(管理npm源)
1、安装
npm install nrm -g
2、常用命令
# 列出npm源列表
nrm ls
# 查看当前使用的源
nrm current
# 切换源 -- 比如切换到taobao
nrm use taobao
# 添加自定义源
nrm add <registry> <url> [home]
四、nvm(管理nodejs版本)
- Mac/Liunx -- nvm
- Windows -- nvm-windows
1、下载nvm-windows
-
下载nvm-setup.zip
-
一路"next"完成
注:如果在安装nvm-windows之前安装过nodejs。
安装过程中则会提示"你希望nvm管理已经安装的 node 版本吗?"。
选择"是"即可
2、使用
# 列出可安装的版本
nvm list available
# 列出已安装的版本
nvm list
# 安装指定的版本的nodejs,例如
nvm install 10.15.0
# 使用指定版本的nodejs,例如
nvm use 10.15.0
五、Express
1、初始化项目
# 创建myapp目录
mkdir myapp
# 进入myapp目录
cd myapp
# 生成 package.json 文件
npm init
# 将入口改为app.js
2、安装express
npm install express --save
# 以下几个重要模块需要与 express 框架一起安装
# node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
npm install body-parser --save
# 解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
npm install cookie-parser --save
# node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
npm install multer --save
3、简单服务
// 导入express
const express = require('express');
// express实例
var app = express();
// get请求
app.get('/getName/:age',(req,res)=>{
let {age} = req.params;
res.json({
name:'张get',
age
});
});
// post请求
app.post('/getName',(req,res)=>{
res.send('张post')
});
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
六、Route(路由)
// 导入express
const express = require('express');
// express实例
var app = express();
// 1、通过请求的方法类型 get/post/put/delete
app.get('/demo',(req,res)=>{
// req:请求对象
// res:服务器响应对象
res.json({
message:'hello get'
})
})
app.post('/demo',(req,res)=>{
res.json({
message:'hello post'
})
})
// 2、通过uri
app.get('/user/byname',(req,res)=>{
let {name} = req.query;
res.json({
name
})
})
app.get('/user/byid',(req,res)=>{
let {id} = req.query;
res.json({
id
})
})
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
1、app.all
1.1、场景一
满足客户端无论使用什么请求方式都可以得到响应
// 导入express
const express = require('express');
// express实例
var app = express();
app.all('/demo',(req,res)=>{
res.json({
message:'hello get'
})
})
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
1.2、场景二
无论客户端使用任何uri都可以响应
// 导入express
const express = require('express');
// express实例
var app = express();
app.all('*',(req,res)=>{
res.json({
message: 'demo',
method: req.method,
uri: req.path
})
})
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
2、app.use
以上两个场景也可通过use实现。不过一般use作为中间件使用。
3、路由拆分
// member.router.js
// 导入express
const express = require('express');
// 创建路由
const router = express.Router();
router.get('/list',(req,res)=>{
res.json({
list:[
id:001,
name:'李四'
]
})
})
module.exports = router;
// sku.router.js
// 导入express
const express = require('express');
// 创建路由
const router = express.Router();
router.get('/list',(req,res)=>{
res.json({
list:[
name:'鞋子'
]
})
})
module.exports = router;
// 导入express
const express = require('express');
// express实例
var app = express();
// 注册路由
const memberRouter = require('./member.router');
const skuRouter = require('./sku.router');
app.use('/member',memberRouter); // 访问:member/list
app.use('/sku',skuRouter); // 访问:sku/list
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
七、express中间件
1、中间件完整结构
- 是一个函数
- 2、err,req,res,next -> function
// 导入express
const express = require('express');
// express实例
var app = express();
// 中间件完整的结构
// 1、是一个函数
// 2、err,req,res,next -> function
function demo_middleware(err,req,res,next){
// 1、异常处理
// 2、处理业务功能,然后转交控制权 -- next
// 3、响应请求 -- 结束响应 --> 当作路由的处理函数
}
function valid_name_middleware(req,res,next){
let {name} = req.query;
if(!name || name.length){
res.json({
message:'缺少name参数'
})
}else{
next();
}
}
// 匹配1
app.all('*',valid_name_middleware);
// 匹配2
app.get('/test',(req,res)=>{
res.json({
message:'test'
})
})
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
2、中间件各级别的使用
-
app (应用)级别的使用
-
注册的使用,一定在最顶级
-
app.use --> api加载
// 导入express const express = require('express'); // express实例 var app = express(); function log_middleware(req,res,next){ console.log('请求来了。。。'); next(); } // app级别使用 app.use(log_middleware); // 加载 static 的中间件(内置) // 获取static目录下的静态文件 app.use(express.static('static',{ // 如果请求没有后缀,自动加默认后缀 extensions:['html','htm'] })) app.listen(3000,()=>{ console.log('服务已经启动。。。'); });
-
-
router 级别
// user_router // 导入express const express = require('express'); // 创建路由 const router = express.Router(); router.use(function(req,res,next){ console.log('log from router'); next(); }) // 路由内部使用 router.get('/demo',[/** middleware */],(req,res)=>{ res.json({ message:'from route demo' }) }) module.exports = router;
// 导入express const express = require('express'); // 注册路由 const userRouter = require('./router/user_router'); // express实例 var app = express(); // router级别使用 app.use('/user',userRouter); app.listen(3000,()=>{ console.log('服务已经启动。。。'); });
-
异常处理
八、异常处理
// 导入express
const express = require('express');
// express实例
var app = express();
app.get('/demo',(req,res)=>{
throw new Error('测试异常');
});
// 中间件
function error_handler_middleware(err,req,res,next){
if(err){
let {message} = err;
res.status(500);
.json({
message: `${message || '服务器异常'}`
})
}
}
// 404处理
function not_found_handler(req,res,next){
res.json({
message:'api不存在'
})
}
app.use(not_found_handler); // 先判断此异常
app.use(error_handler_middleware); // 最后判断此异常
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
九、Sequelize
1、安装
# 安装
npm install sequelize -S
npm install sequelize-cli -S
npm install mysql2 -S
npx sequelize-cli init
2、配置
- 修改config目录下的config.json文件
3、创建数据模型
npx sequelize-cli
model:generate
--name User # 表名称
--attributes # 属性。字段名:字段类型
firstName:string,
lastName:string,
email:string
4、生成数据库表
npx sequelize-cli db:migrate --env=<config.json的环境key>
5、js
// 导入express
const express = require('express');
// express实例
var app = express();
const models = require('../models');
// 插入一条数据
app.get('/create',async (res,req)=>{
let {name} = req.query;
// 返回promise user-->sequelize对象
let user = await models.User.create({
name
})
console.log(user);
res.json({
message:'创建成功',
user
})
})
// 获取列表
app.get('/list',async (res,req)=>{
let list = await models.User.findAll();
res.json({
list
})
})
// 查询一条数据
app.get('/detail/:id',async (res,req)=>{
let {id} = req.params;
let user = await models.User.findOne({
where:{
id
}
});
res.json({
user
})
})
app.listen(3000,()=>{
console.log('服务已经启动。。。');
});
本文内容学习自 慕课网 -- Nodejs全栈入门