摘要:前言學習也有一段時間了,踩過許多坑,在這里打算記錄一下自己覺得有用的點,以備以后所需。代碼調試一般我們調試項目都是通過前端或者后端,這總是顯得不夠靈活。即使是內置的也不夠友好。這樣修改文件時服務就會自動重啟了。
前言
學習NodeJs也有一段時間了,踩過許多坑,在這里打算記錄一下自己覺得有用的點,以備以后所需。
代碼調試一般我們調試Js項目都是通過Alert()(前端)或者 Console.log()(后端),這總是顯得不夠靈活。即使是NodeJs內置的debugger也不夠友好。這里推薦一款調試工具Node Inspector。這個工具結合Chrome就能達到Eclipse的debug模式的強大效果。
首先 npm install -g node-inspector 全局安裝
然后 node-inspector 啟動工具
編寫一段測試代碼 server.js :
var http = require("http"); debugger; function onRequest(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); debugger; response.write("Hello World"); debugger; response.end("end of hello world"); } http.createServer(onRequest).listen(8888);
另開控制臺窗口 node --debug-brk server.js
在chrome中打開http://127.0.0.1:8080/debug?port=5858就可以看到程序在斷點處暫停,我們就可以在chrome控制臺訪問程序斷點前的變量了,還可以查看調用棧,也可以單步執行等等。
另外如果你喜歡IDE的話不妨用webstorm,這是目前號稱JavaScript最友好的IDE了,當然少不了代碼調試功能。
文件變化后重啟服務?每當我們修改代碼源文件的時候,都要關掉進程重啟,這是相當麻煩的事,辛運的是已經有些工具來幫我們監聽文件,并在文件變化之時自動重啟服務。
比如node-dev,安裝:npm install -g node-dev 然后 node-dev server.js。這樣修改文件時服務就會自動重啟了。如圖:(對了,這個GIF錄制工具叫做 GIFcam,很好用的)
如果使用的是express4.X 就使用node-dev bin/www,如果是express3.X 就使用node-dev app.js。
那么部署到服務器上怎么辦?,這里強推pm2。
npm install -g pm2
然后
pm2 bin/www --name "express" --watch
這樣就可以穩定運行了,監聽文件變化了。
當然不要忘了設置為生產環境,所以這樣
pm2 start bin/www --env production
甚至,可以直接寫一個start.json文件,把你想要的配置都寫進去,
{ "apps" : [{ "name" : "express", "script" : "bin/www", "log_date_format" : "YYYY-MM-DD HH:mm:SS", "env": { "NODE_ENV": "production" }, "watch" : true }] }
然后執行如下命令即可
pm2 start start.json
最后設為開機啟動
pm2 startup
還有一種解決方案就是screen + node-dev,用node-dev 來監聽文件變化,用screen來使得服務后臺一直運行。
異步編程異步的一大難點就是原來順序執行的思路不通了,比如對于一個登錄請求過來,你得先在數據庫查看有沒有這個用戶,其次再獲得他的權限,然后檢查模板文件,最后渲染頁面給他。用PHP寫的話,我們只需要順著寫就行了,因為所寫順序即是所執行的順序,沒什么問題。但是Node由于是異步的,這一步所依賴的由上一步產生的數據可能還沒來得及產生,就會出錯,所以我們為了保證程序運行,通常會使用嵌套
query(sql1,function(error, results){ if (error) next(); query(sql2,function(error, results){ if (error) next(); check(file,function(error, results){ if (error) next(); render(results); }); }); });
這只是一個個例,如果更復雜的邏輯按照這種思想就會產生深層次的嵌套,顯然不是我們想看到的。這個時候就是event模塊派上用場的時候了
var events = require( "events" ); query(sql1,function(error, results){ if (error) next(); emiter.emit("user",results);//觸發信號,傳遞數據 }); emiter.on("user",function (user) {//綁定監聽器 query(sql2,function(error, results){ if (error) next(); emiter.emit("authority",results);//觸發信號,傳遞數據 }); }); emiter.on("authority",function (authority) {//綁定監聽器 check(file,function(error, results){ if (error) next(); render(results); }); });
這樣子整個流程就清晰許多了。
用Nginx來提供靜態資源Nginx一直以其高性能著稱,我們設計一個應用的時候,最好就是讓nginx來提供靜態資源,讓node只負責處理數據以及邏輯上的動態資源,這樣能降低node負載,提高效率。
apt-get install nginx service nginx start
修改配置
vim /etc/nginx/sites-enabled/default server { listen 80 default_server; location / { proxy_pass http://localhost:3000; } location /public/ { root /var/www/public/ ;#親測不能放在root文件夾下面,即使修改權限777也會被拒絕訪問 } }
重啟
service nginx restart
需要注意的是,如果你有獲取客戶端ip的需求的話要這樣配置
location / { proxy_pass http://localhost:3000; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; }
然后node代碼:
function getClientIp(req) { return req.headers["x-forwarded-for"] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress; } var ip = getClientIp(req);
如果不按照上面的配置,這段代碼得到的結果始終是127.0.0.1。
歡迎訪問我的主頁(http://mageek.cn)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39358.html
摘要:開發需要編程規范嗎的靈活性非常大,如果開發人員每個人都按自己的習慣隨意編寫,的代碼會非常混亂不堪。程序員需要更強的自律性和規范,才能寫出易讀性,易維護的代碼。 node開發需要編程規范嗎? js的靈活性非常大,如果開發人員每個人都按自己的習慣隨意編寫,js的代碼會非常混亂不堪。js程序員需要更強的自律性和規范,才能寫出易讀性,易維護的代碼。 隨著前端mvc的崛起,前端的js代碼會更加...
摘要:在終端輸入會詢問的各種信息,從而確認。這意味著,所有通過安裝的包都可以在終端以命令方式運行,例如,等。用于檢查模塊是否過時并列出。文件在運行后會生成文件,該文件用于記錄項目中所用到的依賴以及項目的配置信息比如名稱版本許可證等。 一直以來,作為前端開發,在公司都是先寫好頁面,然后再跟后端合作,將數據填入前端頁面中,但是偶爾自己閑來無事,也會看一些框架什么的,然后利用框架做個單頁面應用啊,...
摘要:三中間件實現原理首先需要明確是中間件并不是中的概念,它只是和框架衍生的概念。中間件的執行流程主要由與函數決定依次取出中間件終止條件路由匹配規則函數中使用閉包函數來檢測是否與當前路由相匹配,匹配則執行該上的中間件函數,否則繼續檢查下一個。 Koa作為下一代Web開發框架,不僅讓我們體驗到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡潔的特點,更加利于開發者結合業務...
摘要:概述本篇主要介紹的運行機制單線程事件循環結論先在中利用運行至完成和非阻塞完成單線程下異步任務的處理就是先處理主模塊主線程上的同步任務再處理異步任務異步任務使用事件循環機制完成調度涉及的內容有單線程事件循環同步執行異步執行定時器的事件循環開始 1.概述 本篇主要介紹JavaScript的運行機制:單線程事件循環(Event Loop). 結論先: 在JavaScript中, 利用運行至...
摘要:連接數據庫如果不自己創建默認數據庫會自動生成地址跟第一步的地址對應。現在回過頭來看里面的入口文件最后,我們在瀏覽器輸入,就會跳到。到此為止,我們就完成了整個前后端各自開發到正式部署的流程。 一個完整的網站服務架構包括:1、web frame ---這里應用express框架2、web server ---這里應用nodejs3、Database ---這里應用monggoDB4、...
閱讀 2508·2023-04-25 19:31
閱讀 2244·2021-11-04 16:11
閱讀 2811·2021-10-08 10:05
閱讀 1520·2021-09-30 09:48
閱讀 2319·2019-08-30 15:56
閱讀 2414·2019-08-30 15:56
閱讀 2177·2019-08-30 15:53
閱讀 2272·2019-08-30 15:44