2014-06-20 40 views
0

我有一個現有的應用程序,包括兩個php生成的初始頁面(普通用戶頁面 - index.php和管理頁面admin.php)。用戶頁面會生成一些非常大的桌面,在桌面上很好,但在移動設備上將無法使用。管理頁面實際上只是通過ajax加載的一組子頁面的框架(再次使用php生成)。管理頁面(尤其是用戶頁面不那麼)由支持動態操作用戶界面的大型JavaScript應用程序支持。這必須如此之大以至於很難管理。理想情況下,它應該分解成更小的塊。我如何使用node.js成爲一個動態內容web服務器

此外,幕後交易發生在sqlite數據庫上,因爲javascript使用ajax發送post請求,服務器用json迴應。這些響應由php提供。

爲了增加這個組合,我剛將應用程序從Apache(帶有嵌入式php)移到了不再嵌入php的Nginx中。

爲了支持移動設備上的應用程序,我計劃使用angularjs將應用程序重新開發爲一個單頁面應用程序,並使用更小的單獨頁面。由於這更適用於mvc風格的應用程序,因此它將幫助我將unweildy javascript重組爲更好的組織環境。

當我學習angularjs時,越來越多地發現自己處於nodejs和javascript的世界中作爲流程管理工具。特別是測試 - 包括量角器 - 其中npm模塊http-server用於爲應用程序的客戶端提供測試Web服務器。

由於angularjs本身管理更多的應用程序的視圖元素,我將不再需要PHP來實現這一點。這個應用程序需要的唯一東西就是模型的軟件,並且需要ajax請求,查詢或更新數據庫並返回json響應。而不是使用PHP,在我看來,我也可以使用Javascript運行服務器端來實現這一點。

這裏有細微的差別,需要清楚。有一些JavaScript文件需要像服務器上的靜態資產一樣運行,並且只是像客戶端一樣提供服務。在部署中,Nginx可以實現這一點。但是,我會有服務器應用程序的JavaScript文件。 Nginx可以通過url識別這些內容,而不是將它們傳遞給一個php處理器,就像在一個高編號的端口上監聽本地主機上的node.js應用程序一樣,它可以像代理前端一樣輕鬆地進行操作。因爲這些服務器端JavaScript小程序每個都與數據庫交談,我認爲(我還沒有檢查細節,但粗略的外觀意味着如此),他們不能立即響應http請求,而是需要在回調函數被調用說數據庫請求成功後觸發一個響應。

簡要介紹一下expressjs以及如何爲它提供內容,似乎需要使用它所使用的任何回調函數的即時響應。它也可能是我所需要的重量級。

有人可以給我一些建議,如何最好地設計這種解決方案。什麼是使用

+0

StackOverflow並沒有真正提供建議,尤其是在這個問題上沒有這麼廣泛。你需要提出一個特定的編程問題。就目前而言,您的問題過於寬泛 – Bojangles

+0

移動環境中沒有node.js。 – Vinz243

+0

@ Vinz243:這個節點的一部分將在他的服務器上。 –

回答

1

因爲這些服務器端JavaScript小應用程序每個通話的數據庫,我想......他們不能立即對HTTP請求作出迴應,而是需要觸發後的響應最好包回調函數被稱爲數據庫請求成功。

的確,響應必須來自回調,但這並不意味着它比阻止等待數據庫的代碼慢。

簡要介紹一下expressjs以及如何爲它提供內容,似乎需要使用它所使用的任何回調函數的即時響應。

不,Express與Node應用程序的異步性質很好。

會發生什麼,大致是:

  • 瀏覽器打開到服務器的連接(我會假裝保持活動不存在,simplicitly)
  • 快速處理,對於你,你不必做任何事情
  • 瀏覽器發送HTTP請求到服務器
  • 快速確定哪些您的回調的要求應該觸發,並觸發其
  • 你在回調代碼看到,這是一個數據庫請求和開始的DB工作,給它當響應進來
  • 你的DB代碼回調回調時DB結果可用
  • 你的代碼被解僱產生相關的響應,並將其發送出去

在代碼(這裏是app調用快車express()功能,examples in their guide的結果):

// Rule for the URL /ajax-handler 
app.get('/ajax-handler', function(req, res){ 
    // Look at the information on `req` to find out what DB work to do 
    // ... 

    // Start the work -- this function would depend on the DB layer you're 
    // using, the name `startDatabaseWork` below isn't literal 
    startDatabaseWork(/*...information for the DB work...*/, function(result) { 
    // We have the result, use it to send back the information 
    res.send(/*...the results in the appropriate format...*/); 
    }); 
}); 

Node和Express工作方式的異步性對於撥打電話的瀏覽器而言是透明的(並且不相關)。

對於您的解決方案,Express是否太「重量級」只有您可以確定。


有人能給我這種類型的解決方案如何最好的建築師一些建議。什麼是最好的包使用

問題的這一部分不在堆棧溢出的範圍內。適用的樣板「關閉問題」原因是「太廣泛 - 有太多可能的答案,或者對於這種格式,好的答案會太長。請添加詳細信息以縮小答案集或隔離可能存在的問題在幾段中回答。「 「主要基於意見 - 許多優秀的問題根據專家的經驗產生了一定程度的意見,但對這個問題的回答往往基於意見,而不是事實,參考或具體專業知識。」

+1

謝謝,你的一點代碼通過問題回答。我認爲我的誤解是,我必須在退出函數之前將響應置於res,而不是稍後可以調用res.send() – akc42

+0

@ akc42:很高興幫助。是的,將頭圍住它可能會很棘手...... –

相關問題