NodeJS開發博客

1 區分 ECMAScript/JS/NodeJsnode

--ECMAScript。定義了語法,寫JS和NodeJS都要遵照;ajax

變量定義,循環/判斷/函數;npm

原型和原形鏈/做用域和閉包/異步json

不能操做DOM 不能監聽click事件,不能發送ajax請求,不能處理http請求,不能操做文件。promise

總之,只有ECMAScript 幾乎作不了任何實際項目。瀏覽器

-- JS 。使用了 ECMAScript 語法規範,外加 WebAPI 缺一不可。服務器

包含DOM操做 BOM操做 事件綁定 AJAX等閉包

兩個結合在能完成瀏覽器端的操做。app

--NodeJS 。 使用了 ECMAScript 語法規範,外加 nodeJS API 缺一不可。異步

處理http,處理文件等

二者結合,能夠完成server端的操做。

 

2 一個簡單get示例

 

 

const http = require('http');
const querystring = require('querystring'); //nodejs 自帶的模塊
const server = http.createServer((req,res)=>{
    console.log(req.method);  //GET 大寫
    const url = req.url;
    //querystring的做用是把url中的 name=lihua 改爲對象的格式
    req.query = querystring.parse(url.split('?')[1]);
    console.log(JSON.stringify(req.query));
    res.end(
        //再轉成 JSON 格式
        JSON.stringify(req.query)
    )
})
server.listen(8000);
console.log('ok');

 

3. 一個簡單的 post 請求示例

const http = require('http');
const server = http.createServer((req,res)=>{
    if(req.method === 'POST'){
        //數據格式
        console.log('content-type',req.headers['content-type']);
        //接受數據
        let postData = "";
        req.on('data',chunk => {//post請求 監聽數據 相似與水管 數據流的傳輸
            postData += chunk.toString();
        })
        req.on('end',()=>{
            console.log(postData);
            res.end('hello world'); //在這裏返回,由於是異步
        })
    }
})
server.listen(8000);
console.log('ok');

使用postman請求post接口:

 

4. 綜合示例

const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req,res)=>{
    const method = req.method;
    const url = req.url;
    const path = url.split('?')[0];
    const query = querystring.parse(url.split('?')[1]);
    //設置返回格式是 JSON
    res.setHeader('Content-type','application/json');

    //返回的數據
    const resData = {
        method,
        url,
        path,
        query
    }
    //返回
    if(method === 'GET'){
        res.end(//返回的是json字符串
            JSON.stringify(resData)
        )
    }else if(method === 'POST'){
        //接受數據
        let postData = "";
        req.on('data',chunk => {//post請求 監聽數據 相似與水管 數據流的傳輸
            postData += chunk.toString();
        })
        req.on('end',()=>{
            resData.postData = postData;
            res.end(
                JSON.stringify(resData)
            ); //在這裏返回,由於是異步
        })
    }
})
server.listen(8000);
console.log('ok');

 5 使用nodemon 檢測文件變化,自動重啓服務器。

 6 promise的使用

先編輯三個js文件 :a.js,b.js ,c.js

 

//a.js
{
    "next":'a.json',
    "msg":"this is ba"
}
//b.js
{
    "next":'b.json',
    "msg":"this is b"
}
//c.js
{
    "next":null,
    "msg":"this is c"
}

 

對應的index文件:

const fs = require('fs');
const path = require('path');
function getFileContent(fileName,callback){
    const fullFileName = path.resolve(__dirname,'files',fileName);
    false.readFile(fullFileName,(err,data)=>{
        if(err){
            console.error(err);
            return;
        }
        callback(
            JSON.parse(data.toString())
        )
    })
}

//測試 callback-hell
getFileContent('a.json',aData=>{
    console.log('a data',aData);
    getFileContent(aData.next,bData=>{
        console.log('b data',bData);
        getFileContent(bData.next,cData=>{
            console.log('c data',cData);
        })
    })
})

//使用 promise函數,編寫代碼,成功執行 resolve,失敗執行 reject

function getFileContent(fileName){
    const promise = new Promise((resolve,reject)=>{
        const fullFileName = path.resolve(__dirname,'file',fileName)
        fs.readFile(fullFileName,(err,data) => {
            if(err){
                reject(err)
                return
            }
            resolve(
                JSON.parse(data.toString())
            )
        })
    })
  return promise; }
//使用 promise getFileContent('a.json').then((aData)=>{ console.log('a data',aData); return getFileContent(aData.next); }).then((bData)=>{ console.log('b data',bData); return getFileContent(bData.next); }).then((bData)=>{ console.log('c data',cData); })

 

=================================

7. 搭建初始環境

對上面4的代碼進行了劃分:

文件的目錄結構以下:

其中 bin/www.js 文件只是設置最基本的http代碼:

//基本技術
const http = require('http');
const PROT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);
server.listen(PROT)

其中 serverHandle文件至關於 createrServer的回調函數,獲取於 app.js:

// 業務代碼
const serverHandle = (req,res) =>{
    res.setHeader('Content-type','application/json')
    const resData = {
        name:'lihua',
        age:12,
        env:process.env.NODE_ENV
    }
    res.end(
        JSON.stringify(resData)
    )
}
module.exports = serverHandle

安裝  cross-env 和  nodemon 後,package.json文件爲:

{
  "scripts": {
    "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
    "prod": "cross-env NODE_ENV=production nodemon ./bin/www.js"
  }  
}

執行 npm run dev 便可運行;

 分析需求 有下面幾個接口:

相關文章
相關標籤/搜索