成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

NodeJs項(xiàng)目中的一些要點(diǎn)記錄

superPershing / 2956人閱讀

摘要:前言學(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

相關(guān)文章

  • nodejs編程規(guī)范

    摘要:開發(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ì)更加...

    Tony_Zby 評(píng)論0 收藏0
  • Nodejs之npm&package.json

    摘要:在終端輸入會(huì)詢問的各種信息,從而確認(rèn)。這意味著,所有通過安裝的包都可以在終端以命令方式運(yùn)行,例如,等。用于檢查模塊是否過時(shí)并列出。文件在運(yùn)行后會(huì)生成文件,該文件用于記錄項(xiàng)目中所用到的依賴以及項(xiàng)目的配置信息比如名稱版本許可證等。 一直以來,作為前端開發(fā),在公司都是先寫好頁面,然后再跟后端合作,將數(shù)據(jù)填入前端頁面中,但是偶爾自己閑來無事,也會(huì)看一些框架什么的,然后利用框架做個(gè)單頁面應(yīng)用啊,...

    atinosun 評(píng)論0 收藏0
  • 玩轉(zhuǎn)Koa -- 核心原理分析

    摘要:三中間件實(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ù)...

    jsbintask 評(píng)論0 收藏0
  • JavaScript單線程事件循環(huán)(Event Loop)那些事

    摘要:概述本篇主要介紹的運(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)行至...

    Shisui 評(píng)論0 收藏0
  • MEVN 架構(gòu)(MongoDB + Express + Vue + NODEJS)搭建

    摘要:連接數(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、...

    Lsnsh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<