原生Node.js

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)
})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容