2016-01-13 65 views
4

因此,我幾乎讀過所有關於此主題的答案/問題,但我仍然有很多疑問。使用AngularJS和外部NodeJS服務器啓用html5模式

首先,問題:

我有支持HTML5的應用程序AngularJS,這樣我就可以擺脫「#」標誌。

$locationProvider.html5Mode({ enabled: true, requireBase: true }); 
$locationProvider.hashPrefix('!'); 

這是我的index.html的重要組成部分:

<!DOCTYPE html> 
<html ng-app="application" ng-controller="ApplicationController as app"> 
    <head> 
    <meta name="fragment" content="!"> 

    <title>LivingRoomArt</title> 

    <meta charset="UTF-8"> 
    <base href="/index.html" /> 

我有服務器的NodeJS通信這是使用快報:

router.route('/events') 
    .post(authController.isAuthenticated, eventController.postEvent) 
    .get(eventController.getEvents); 

// Register all our routes with /api 
app.use('/api', router); 

// Start the server 
app.listen(process.env.PORT || 5000); 

所以,通常的問題:

重新加載後,我從服務器獲取404。我得到的這個概念在這裏,處處建議的解決方案:

// This route deals enables HTML5Mode by forwarding missing files to the index.html 
    app.all('/*', function(req, res) { 
    res.sendfile('index.html'); 
    }); 
}); 

的事情是,我沒有我的服務器上的index.html文件,既不做 我想在複製它我的服務器。

那麼,我該如何告訴Node正確處理請求,而無需在我的服務器上存儲html文件?

我在Heroku上託管Node應用程序,如果有幫助。

+0

所以,你有一個客戶端服務器和API服務器,對不對? 404錯誤是客戶端服務器上的句柄? – Zagonine

+0

那麼,現在無處:)但我可以在客戶端處理它,是的。我有一個API服務器和我的客戶端的靜態服務器(HTML,JS等) –

+0

然後呢?我需要訪問子視圖並在那裏進行AJAX調用。 –

回答

1

當你說你不提供靜態文件,你是說node.js API是不正確的?

我想你最終會得到兩個不同的網址,我們稱它們爲http://api.comhttp://client.com

我不明白爲什麼你的API應該處理404。你在你的瀏覽器中加載http://api.com並期待你的index.html?如果這是真的你的使用情況,我會建議一個簡單的路由你的API中聲明,如:

app.all('/*', function (req, res) { 
    res.redirect('http://client.com'); 
}); 

這將重定向不是你以前的路線聲明逮住你的客戶網站的所有請求。


然後,有兩種選擇:

如果是服務於您的靜態文件服務器是另一個節點。Js服務器使用快速,你可以完全做sendfile,因爲你現在有權訪問index.html

如果你正在使用Nginx,(我強烈建議,如果你不這樣做)靜態,你可以做一個這樣的配置,以重定向所有失敗的請求(文件丟失/路由)到index.html

server { 
    listen 80; 

    root /app/www; 
    index index.html; 

    location/{ 
    try_files $uri $uri/ /index.html; 
    } 
} 
+0

明天我會試試。現在就讀這個,但我可以回答一個問題:https://api.com沒有返回index.html,它只是返回空白。這是一個純粹的REST API。也許這會改變一點答案?對於nginx。不,我不知道。你能推薦一個服務來做到這一點嗎? –

+0

嗯,是啊,你的api沒有返回索引是完全正常的,我只是問你是否想對它做一些特別的事情。所以你現在正在使用節點來爲你的靜態文件提供服務?是的,我會推薦一些* amazon網絡服務*,您可以在其中設置一個nginx或者一個專用的服務器,但aws是非常低成本的。 –