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 便可運行;
分析需求 有下面幾個接口: