node中模块系统及核心模块、执行node文件
node中模塊系統:
1.模塊系統:核心模塊、第三方模塊、 自己寫的模塊。
2.網頁中所有的路徑都是URL,而不是文件路徑。
3.node偏底層開發,開啟的服務器完全是一個黑盒子,所有的資源默認都是不能被用戶訪問的,必須自己編寫代碼設計開放資源。
4.在node中實現服務器重定向:header(‘location’,‘地址’) , 301----永久重定向 302----臨時重定向
5.模塊系統:模塊作用域 使用require()加載模塊 使用exports接口對象導出模塊中的成員。
在一個模塊中是無法使用另一個模塊中的成員的,如果真的需要使用,必須使用exports導出才可以在另一個模塊中使用,如:
導出add方法:function add(x,y){
return x + y;
}
exports.ad = add;
6.導出多個成員和導出一個成員:
對于希望被其他模塊訪問到的成員,必須掛載到exports接口對象中導出,如:exports.a = ‘123’;
exports.b = 3333;
exports.c = function(){};
exports.b = {};
7.默認導出的是一個對象,如果需要導出一個成員那么就要重新賦值:module.exports = ‘新的值’,
module.exports 使用多次也是無效的,因為后面的會覆蓋前面的,當然可以使用對象的方式導出多個成員,如:
module.expirts = {
add:function(){},
a:‘123’,
b:123,
c:{},
d:[]
};
8.require()優先從緩存加載,require()每次在加載的時候先在緩存中找是否加載過,如果加載過直接拿來用,否則在加載,體現模塊系統的高效。
9.require(’./test.js’)加載自己寫的模塊時,括號里面是路徑,必須以./或者…/開始,不能省略,加載核心模塊時括號里面不是路徑,直接寫模塊名就可以。
加載第三方模塊時,括號里面寫安裝的包名,第三方模塊實際加載的是:當前文件所在目錄中的node_modules目錄 --> art-template --> package.json文件中main屬性所指向的index.js文件。
在命令窗口執行node.js文件:
在命令行執行node.js代碼只需鍵入:node +文件名(node.js文件不能以node.js命名,文件的后綴名可以省略) 即可,打開命令行的三種方式:
1.window + r -> cmd回車
2.在當前文件目錄鼠標右鍵通過Git打開
3.shift + 鼠標右鍵 ->在此處打開Powershell窗口,下面將初步介紹幾種基本語法和常用模塊:
核心模塊:
node為js提供很多服務器級別的API,這些API絕大多數被包裝到一個具名的核心模塊中,例如文件操作的fs模塊,http服務構建的http模塊,path路勁操作模塊;加載模塊使用:require(‘模塊名’),通過此方法也可以相互加載nodejs文件,更多模塊了解可閱讀:https://nodejs.org官方文檔;如下模塊:
// 在命令窗口打開文件執行以下代碼:// 1.執行簡單代碼并測試window和document在node中是否存在:var str = 'hello';console.log(str); //helloconsole.log(window); //ReferenceError: window is not defined at Object.console.log(document); //ReferenceError: document is not defined at Object.// 2.載入內置fs文件模塊:const fs = require('fs');fs.readFile('../測試.txt', function(errors, datas) { //readFile讀取文件,里面可以傳入兩參數,第一個為文件路徑;第二個為回調函數(回調函數中第一個參數為讀取失敗時的錯誤對象,讀取成功時為null;第二個參數為讀取成功時的數據,讀取失敗時為undefined)if (errors) {console.log('文件讀取失敗!');return false;} else {console.log('讀取文件內容為:' + datas); //有的時候可能會返回二進制數據經計算機轉為十六進制數據,此時可以使用.toString()將其轉為我們可以認識的字符};});fs.writeFile('./<>.txt', '苦海1', function(error) { //writeFile寫入文件,里面可傳入三個參數,一為文件路徑;二為寫入文件的字符;三為回調函數(回調函數中只有一個參數,寫入成功時為null,寫入失敗時為錯誤對象),注意:如果沒有路徑指向的文件,則會自動創建文件并寫入內容,除非文件命名失敗才會寫入失敗。if (error != null) console.log('文件寫入失敗!');});fs.readdir('./lib', function(error, data) { //文件路徑:用于訪問指定路徑下的文件,第一個參數表示要訪問到額路徑;第二個參數是回調函數(回調函數中第一參數表示訪問失敗時的錯誤對象,第二個參數表示訪問成功時的成功對象)console.log(error); //當訪問成功時,error對象是null;訪問失敗時此對象是錯誤對象console.log(data); //當訪問成功時,以數組的形式返回當前目錄下的文件結構;訪問失敗時返回undefined});// 3. 載入內置http模塊:所有聯網的程序都要進行網絡通信,計算機中只有一個物理網卡,而且同一個局域網中,網卡的地址必須是唯一的,網卡通過唯一的IP地址來定位; IP定位到具體的電腦,端口號定位到具體的應用程序,所有聯網的軟件都會占用一個端口號。const http = require('http');const server = http.createServer(); //使用createServer創建一個web服務器server.on('request', function(request, response) { //給server注冊請求事件request,回調函數中可以傳入兩個參數,第一個為請求對象,第二個額為響應對象;它們中有幾個比較重要的屬性,如下:response.write('<h1>Hellow,this is .write()API</h1>'); //響應給瀏覽器的內容,此方法需要配合response.end()方法才可以實現效果;當然實際推薦只使用end方法也是可以實現相同的效果的,前提是將響應內容傳入end括號中:response.end('<h1>Hellow,this is .write()API in end</h1>'); //將響應內容直接傳入end中可以省略writer方法response.setHeader('Content-Type', 'text/plain;charset=utf-8'); //瀏覽器默認編碼與相應的編碼不一致時會亂碼,這里.setHeader()設置響應頭中Content-Type,不同的資源對應的 Content-Type 是不一樣的,可以到這里查詢:http://tool.oschina.net/commonsrequest.socket.remoteAddress; //.socket.remoteAddress獲取用戶IP地址request.socket.remotePort; //.socket.remotePort獲取用戶端口號response.statusCode = 302;//設置響應狀態碼,302為臨時重定向response.setHeader('Location', '/');//頁面重定向request.url; //返回瀏覽器輸入url中端口號后面的值,可以利用它做路徑邏輯響應,如:var requestUrl = request.url;if (requestUrl === '/' || requestUrl === '/index.html') {response.end('index.html');} else if (requestUrl === '/login') {response.end('login.html');} else {response.end('<h5>404 NOT FOUND!</h5>');};});server.listen(4000, function() { //綁定端口號,啟動服務,在瀏覽器使用localhost:4000就可以訪問到此服務響應console.log('http服務器啟動成功了');});// 4.url模塊:var url = require('url'); //載入url模塊var result = url.parse('127.0.0.1:3000/test.html?name=jack&age=18', true); //以對象的方式解析URL地址,后面的參數默認為false,當為true時,?后面的內容將以對象的方式呈現,如下案例:console.log(result);/*Url {protocol: '127.0.0.1:',slashes: null,auth: null,host: '3000',port: null,hostname: '3000',hash: null,search: '?name=jack&age=18',query: [Object: null prototype] { name: 'jack', age: '18' },pathname: '/test.html',path: '/test.html?name=jack&age=18',href: '127.0.0.1:3000/test.html?name=jack&age=18'}*/console.log(result.query); //直接獲取?后面的參數 { name: 'joke', message: 'hellow' }實現Apache功能:
//簡單實現Apache功能// 1.加載http和fs模塊:var http = require('http');var fs = require('fs');// 2.創建一個瀏覽器服務:var server = http.createServer();// 定義個路徑的變量:var urldir = '/www'// 3.綁定請求事件:server.on('request',function(request,response){// 獲取請求的路徑:var url = request.url;// 判斷請求的路徑并做出響應if (url==='/') {fs.readFile(urldir + '/index.html',function(error,data){if (error) {return response.end('404 Not Found');}; response.end(data);});} else if (url==='/index.html') {fs.readFile(urldir + '/index.html',function(error,data){if (error) {return response.end('404 Not Found');}; response.end(data);});} else if (url==='/test.txt') {fs.readFile(urldir + '/test.txt',function(error,data){if (error) {return response.end('404 Not Found');}; response.end(data);});} else if (url==='/login.html') {fs.readFile(urldir + '/login.html',function(error,data){if (error) {return response.end('404 Not Found');}; response.end(data);}); };});// 4.監聽端口號:server.listen(3000,function(){console.log('running...');});像Apache一樣找文件:var http = require('http');var fs = require('fs');var urldir = 'www/';var server = http.createServer();server.on('request', function(request, response) {var url = request.url;var indurl = '/index.html'if (url !== '/') {indurl = url;};fs.readFile(urldir + indurl, function(error, data) {if (error) {return response.end('404 Not Found!');};response.end(data);});});server.listen(3000, function() {console.log('running...');});提示:本文圖片等素材來源于網絡,若有侵權,請發郵件至郵箱:810665436@qq.com聯系筆者刪除。
筆者:苦海
總結
以上是生活随笔為你收集整理的node中模块系统及核心模块、执行node文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web SQL介绍,web sql中增删
- 下一篇: 钉钉api 获取 accesstoken