Node自帶模塊
-
http創(chuàng)建http服務 -
url解析url信息 -
path處理文件路徑 -
fs文件管理,其內置函數(shù)第一個參數(shù)是文件路徑,最后一個參數(shù)是callback
fs.stat回調得到的參數(shù)信息執(zhí)行.isDirectory()檢測是文件還是目錄
fs.mkdir創(chuàng)建目錄
fs.writeFile創(chuàng)建寫入文件
fs.appendFile追加文件
fs.readFile讀取文件
fs.readdir讀取目錄
fs.rename重命名
fs.rmdir刪除目錄
fs.unlink刪除文件
開始
創(chuàng)建server.js ,引入模塊
//server.js
const http = require('http')
const url = require('url')
const path = require('path')
調用http中的createServer創(chuàng)建服務器
//server.js
/*
req => request 請求信息
res => response 響應信息
*/
http.createServer((req,res)=>{
url.parse(req.url) //使用url.parse(url,true)解析請求的url地址 后面參數(shù)傳true解析成對象
path.extname() //獲取后綴
res.writeHead(200,{"Content-Type":"text/html;charset=utf8"}) //設置狀態(tài)碼、響應頭
res.write('你好,世界!') //響應內容
res.end('hello,world!') //響應內容并結束,必須
}).listen(8080) //監(jiān)聽的端口
使用node命令執(zhí)行server.js
node server.js
自啟動工具
安裝 supervisor
npm install -g supervisor
使用supervisor代替node命令
supervisor server.js
封裝類似Express框架

18N)E_Y7}8EVO2H7I_AO396.png
//my-express.js
const _http = require('http')
const _fs = require('fs');
const _url = require('url');
const _path = require('path');
const _querystring = require('querystring');
const _mimetype = require('../json/MIME.json');
let myExpress = function(){
let stack = {
get:{},
post:{}
};
let staticPath = null;
let staticSourceExist = null;
app = async function(req,res){
let {url,method} = req;
//獲取訪問的url
let {pathname,query} = _url.parse(url,true);
method = method.toLowerCase();
//將 get 數(shù)據(jù)綁定在 req.query 上
req.query = query;
//將 post 數(shù)據(jù)綁定在 req.body 上
let postData = '';
await new Promise((resolve) => {
req.on('data',(chunk) => {
postData += chunk;
})
req.on('end',() => {
req.body = _querystring.parse(postData);
postData = null;
resolve();
})
})
url = pathname;
//獲取訪問的擴展名
let extname = _path.extname(url);
let mimetype = _mimetype[extname] || 'text/html';
//封裝res.send()
res.send = function (content) {
content = Object.prototype.toString.call(content) === '[object Object]' ? JSON.stringify(content) : content;
var status = staticSourceExist || stack.get[url] || stack.post[url] ? 200 : 404;
res.writeHead(status,{'Content-type':`${mimetype};charset=utf8`});
res.end(content)
}
//設置路由 暴露靜態(tài)資源
switch(method){
case 'get':
staticSourceExist = false;
if(staticPath && extname){
let filePath = _path.resolve(__dirname,`../${staticPath}/${url}`);
await new Promise((resolve,reject) => {
_fs.readFile(filePath,(err,data) => {
if(!err){
staticSourceExist = true;
res.send(data)
}
resolve();
});
})
}
if(stack.get[url]){
stack.get[url](req,res)
}else{
res.send('頁面不存在')
}
break;
case 'post':
if(stack.post[url]){
stack.post[url](req,res)
}else{
res.send('頁面不存在')
}
break;
default:
res.send('不合法的請求')
}
}
let server = _http.createServer(app)
server.static = function(path){
staticPath = path;
}
server.get = function(route,fn){
stack.get[route] = fn
}
server.post = function(route,fn){
stack.post[route] = fn
}
return server;
}
module.exports = myExpress;
簡單使用
//server.js
const myExpress = require('./module/my-express');
let app = myExpress();
let port = 8088;
app.listen(port,(err) => {
if(!err){
console.log(`Server listen in ${port}...`)
}
});
app.static('public');
app.get('/',(req,res)=>{
html = '<form action="/post" method="post">name:<input type="text" name="name"><br>age:<input type="text" name="age"><br><input type="submit"></form>'
res.send(html)
})
app.get('/login',(req,res)=>{
res.send('這是登錄頁面')
})
app.post('/post',(req,res) => {
res.send(req.body)
})