一、入門案例
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全棧入門