摘要:前言學(xué)習(xí)也有一段時(shí)間了,踩過許多坑,在這里打算記錄一下自己覺得有用的點(diǎn),以備以后所需。代碼調(diào)試一般我們調(diào)試項(xiàng)目都是通過前端或者后端,這總是顯得不夠靈活。即使是內(nèi)置的也不夠友好。這樣修改文件時(shí)服務(wù)就會(huì)自動(dòng)重啟了。
前言
學(xué)習(xí)NodeJs也有一段時(shí)間了,踩過許多坑,在這里打算記錄一下自己覺得有用的點(diǎn),以備以后所需。
代碼調(diào)試一般我們調(diào)試Js項(xiàng)目都是通過Alert()(前端)或者 Console.log()(后端),這總是顯得不夠靈活。即使是NodeJs內(nèi)置的debugger也不夠友好。這里推薦一款調(diào)試工具Node Inspector。這個(gè)工具結(jié)合Chrome就能達(dá)到Eclipse的debug模式的強(qiáng)大效果。
首先 npm install -g node-inspector 全局安裝
然后 node-inspector 啟動(dòng)工具
編寫一段測(cè)試代碼 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);
另開控制臺(tái)窗口 node --debug-brk server.js
在chrome中打開http://127.0.0.1:8080/debug?port=5858就可以看到程序在斷點(diǎn)處暫停,我們就可以在chrome控制臺(tái)訪問程序斷點(diǎn)前的變量了,還可以查看調(diào)用棧,也可以單步執(zhí)行等等。
另外如果你喜歡IDE的話不妨用webstorm,這是目前號(hào)稱JavaScript最友好的IDE了,當(dāng)然少不了代碼調(diào)試功能。
文件變化后重啟服務(wù)?每當(dāng)我們修改代碼源文件的時(shí)候,都要關(guān)掉進(jìn)程重啟,這是相當(dāng)麻煩的事,辛運(yùn)的是已經(jīng)有些工具來幫我們監(jiān)聽文件,并在文件變化之時(shí)自動(dòng)重啟服務(wù)。
比如node-dev,安裝:npm install -g node-dev 然后 node-dev server.js。這樣修改文件時(shí)服務(wù)就會(huì)自動(dòng)重啟了。如圖:(對(duì)了,這個(gè)GIF錄制工具叫做 GIFcam,很好用的)
如果使用的是express4.X 就使用node-dev bin/www,如果是express3.X 就使用node-dev app.js。
那么部署到服務(wù)器上怎么辦?,這里強(qiáng)推pm2。
npm install -g pm2
然后
pm2 bin/www --name "express" --watch
這樣就可以穩(wěn)定運(yùn)行了,監(jiān)聽文件變化了。
當(dāng)然不要忘了設(shè)置為生產(chǎn)環(huán)境,所以這樣
pm2 start bin/www --env production
甚至,可以直接寫一個(gè)start.json文件,把你想要的配置都寫進(jìn)去,
{ "apps" : [{ "name" : "express", "script" : "bin/www", "log_date_format" : "YYYY-MM-DD HH:mm:SS", "env": { "NODE_ENV": "production" }, "watch" : true }] }
然后執(zhí)行如下命令即可
pm2 start start.json
最后設(shè)為開機(jī)啟動(dòng)
pm2 startup
還有一種解決方案就是screen + node-dev,用node-dev 來監(jiān)聽文件變化,用screen來使得服務(wù)后臺(tái)一直運(yùn)行。
異步編程異步的一大難點(diǎn)就是原來順序執(zhí)行的思路不通了,比如對(duì)于一個(gè)登錄請(qǐng)求過來,你得先在數(shù)據(jù)庫查看有沒有這個(gè)用戶,其次再獲得他的權(quán)限,然后檢查模板文件,最后渲染頁面給他。用PHP寫的話,我們只需要順著寫就行了,因?yàn)樗鶎戫樞蚣词撬鶊?zhí)行的順序,沒什么問題。但是Node由于是異步的,這一步所依賴的由上一步產(chǎn)生的數(shù)據(jù)可能還沒來得及產(chǎn)生,就會(huì)出錯(cuò),所以我們?yōu)榱吮WC程序運(yùn)行,通常會(huì)使用嵌套
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); }); }); });
這只是一個(gè)個(gè)例,如果更復(fù)雜的邏輯按照這種思想就會(huì)產(chǎn)生深層次的嵌套,顯然不是我們想看到的。這個(gè)時(shí)候就是event模塊派上用場(chǎng)的時(shí)候了
var events = require( "events" ); query(sql1,function(error, results){ if (error) next(); emiter.emit("user",results);//觸發(fā)信號(hào),傳遞數(shù)據(jù) }); emiter.on("user",function (user) {//綁定監(jiān)聽器 query(sql2,function(error, results){ if (error) next(); emiter.emit("authority",results);//觸發(fā)信號(hào),傳遞數(shù)據(jù) }); }); emiter.on("authority",function (authority) {//綁定監(jiān)聽器 check(file,function(error, results){ if (error) next(); render(results); }); });
這樣子整個(gè)流程就清晰許多了。
用Nginx來提供靜態(tài)資源Nginx一直以其高性能著稱,我們?cè)O(shè)計(jì)一個(gè)應(yīng)用的時(shí)候,最好就是讓nginx來提供靜態(tài)資源,讓node只負(fù)責(zé)處理數(shù)據(jù)以及邏輯上的動(dòng)態(tài)資源,這樣能降低node負(fù)載,提高效率。
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/ ;#親測(cè)不能放在root文件夾下面,即使修改權(quán)限777也會(huì)被拒絕訪問 } }
重啟
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);
如果不按照上面的配置,這段代碼得到的結(jié)果始終是127.0.0.1。
歡迎訪問我的主頁(http://mageek.cn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39358.html
摘要:開發(fā)需要編程規(guī)范嗎的靈活性非常大,如果開發(fā)人員每個(gè)人都按自己的習(xí)慣隨意編寫,的代碼會(huì)非?;靵y不堪。程序員需要更強(qiáng)的自律性和規(guī)范,才能寫出易讀性,易維護(hù)的代碼。 node開發(fā)需要編程規(guī)范嗎? js的靈活性非常大,如果開發(fā)人員每個(gè)人都按自己的習(xí)慣隨意編寫,js的代碼會(huì)非?;靵y不堪。js程序員需要更強(qiáng)的自律性和規(guī)范,才能寫出易讀性,易維護(hù)的代碼。 隨著前端mvc的崛起,前端的js代碼會(huì)更加...
摘要:在終端輸入會(huì)詢問的各種信息,從而確認(rèn)。這意味著,所有通過安裝的包都可以在終端以命令方式運(yùn)行,例如,等。用于檢查模塊是否過時(shí)并列出。文件在運(yùn)行后會(huì)生成文件,該文件用于記錄項(xiàng)目中所用到的依賴以及項(xiàng)目的配置信息比如名稱版本許可證等。 一直以來,作為前端開發(fā),在公司都是先寫好頁面,然后再跟后端合作,將數(shù)據(jù)填入前端頁面中,但是偶爾自己閑來無事,也會(huì)看一些框架什么的,然后利用框架做個(gè)單頁面應(yīng)用啊,...
摘要:三中間件實(shí)現(xiàn)原理首先需要明確是中間件并不是中的概念,它只是和框架衍生的概念。中間件的執(zhí)行流程主要由與函數(shù)決定依次取出中間件終止條件路由匹配規(guī)則函數(shù)中使用閉包函數(shù)來檢測(cè)是否與當(dāng)前路由相匹配,匹配則執(zhí)行該上的中間件函數(shù),否則繼續(xù)檢查下一個(gè)。 Koa作為下一代Web開發(fā)框架,不僅讓我們體驗(yàn)到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡(jiǎn)潔的特點(diǎn),更加利于開發(fā)者結(jié)合業(yè)務(wù)...
摘要:概述本篇主要介紹的運(yùn)行機(jī)制單線程事件循環(huán)結(jié)論先在中利用運(yùn)行至完成和非阻塞完成單線程下異步任務(wù)的處理就是先處理主模塊主線程上的同步任務(wù)再處理異步任務(wù)異步任務(wù)使用事件循環(huán)機(jī)制完成調(diào)度涉及的內(nèi)容有單線程事件循環(huán)同步執(zhí)行異步執(zhí)行定時(shí)器的事件循環(huán)開始 1.概述 本篇主要介紹JavaScript的運(yùn)行機(jī)制:單線程事件循環(huán)(Event Loop). 結(jié)論先: 在JavaScript中, 利用運(yùn)行至...
摘要:連接數(shù)據(jù)庫如果不自己創(chuàng)建默認(rèn)數(shù)據(jù)庫會(huì)自動(dòng)生成地址跟第一步的地址對(duì)應(yīng)?,F(xiàn)在回過頭來看里面的入口文件最后,我們?cè)跒g覽器輸入,就會(huì)跳到。到此為止,我們就完成了整個(gè)前后端各自開發(fā)到正式部署的流程。 一個(gè)完整的網(wǎng)站服務(wù)架構(gòu)包括:1、web frame ---這里應(yīng)用express框架2、web server ---這里應(yīng)用nodejs3、Database ---這里應(yīng)用monggoDB4、...
閱讀 2515·2023-04-25 19:31
閱讀 2265·2021-11-04 16:11
閱讀 2819·2021-10-08 10:05
閱讀 1527·2021-09-30 09:48
閱讀 2326·2019-08-30 15:56
閱讀 2422·2019-08-30 15:56
閱讀 2183·2019-08-30 15:53
閱讀 2278·2019-08-30 15:44