2013-10-29 73 views
9

我剛剛開始使用sails和nodejs。如何在sails中創建全局路由前綴?

我想知道,是否有一種簡單的方法來使用Sails中可用的配置創建全局前綴?或者我需要帶來另一個圖書館?

我在config/controller.js中找到了藍圖前綴配置。看起來應該是一個簡單的方法來做到這一點,因爲應用程序已經部分支持它...

我想在我的應用程序的所有路線前面得到/ api/v1之類的東西。

謝謝。

回答

14

您可以在config/controller.js中將prefix屬性設置爲/api/v1。但請注意,這隻會將前綴添加到藍圖路線(由Sails自動生成的路線)。

因此,前綴設置爲/api/v1和路線/some,它可以在uri /api/v1/some訪問。

但是,如果你聲明你的路線是這樣的:"post /someEndPoint": {controller: "someController", action: "someAction"},這個前綴什麼都不做。

在這種情況下,你必須手動進行這樣寫:post /api/v1/someEndPointconfig/controller.js設置爲false actions特性(至少在生產中)要關閉自動生成路線爲你的控制器中的每一個動作。

@EDIT 2014年8月8日

上述適用於的Sails.Js版本比v0.10小。因爲我不再使用Sails,我不知道現在適用於當前版本的框架。

@EDIT 2014年8月14日

對於sails.js版本> = 0.10,其中前綴可設置配置文件是config/blueprints.js。它具有與舊版本相同的功能。

@Edit 2015年9月7日

據我所知,框架不支持手動定義的路由全局前綴,但因爲你仍然可以使用JavaScript在你的配置文件(因爲配置文件是nodeJs模塊而不是JSON文件),您可以輕鬆調整此功能以按需要工作。

假設您的藍圖配置文件中的prefix屬性設置爲/api,則可以在您的路由中包含此代碼。

var blueprintConfig = require('./blueprints'); 

var ROUTE_PREFIX = blueprintConfig.blueprints.prefix || ""; 

// add global prefix to manually defined routes 
function addGlobalPrefix(routes) { 
    var paths = Object.keys(routes), 
     newRoutes = {}; 

    if(ROUTE_PREFIX === "") { 
    return routes; 
    } 

    paths.forEach(function(path) { 
    var pathParts = path.split(" "), 
     uri = pathParts.pop(), 
     prefixedURI = "", newPath = ""; 

     prefixedURI = ROUTE_PREFIX + uri; 

     pathParts.push(prefixedURI); 

     newPath = pathParts.join(" "); 
     // construct the new routes 
     newRoutes[newPath] = routes[path]; 
    }); 

    return newRoutes; 
}; 

module.exports.routes = addGlobalPrefix({ 

    /*************************************************************************** 
    *                   * 
    * Make the view located at `views/homepage.ejs` (or `views/homepage.jade`, * 
    * etc. depending on your default view engine) your home page.    * 
    *                   * 
    * (Alternatively, remove this and add an `index.html` file in your   * 
    * `assets` directory)              * 
    *                   * 
    ***************************************************************************/ 

    // '/': { 
    // view: 'homepage' 
    // }, 

    /*************************************************************************** 
    *                   * 
    * Custom routes here...             * 
    *                   * 
    * If a request to a URL doesn't match any of the custom routes above, it * 
    * is matched against Sails route blueprints. See `config/blueprints.js` * 
    * for configuration options and examples.         * 
    *                   * 
    ***************************************************************************/ 

    'post /fake': 'FakeController.create', 
}); 
+1

感謝。但是,這有點兒是我希望避免的......我希望*帆子有一個簡單的配置,允許(與藍圖分開)。但似乎我可能不得不手動配置它... – rcheuk

+0

@harmlessdragon是的,我有同樣的問題,我認爲前綴應該解決它,但沒有。所以你必須爲每條路線手動編寫你的前綴,我也是這麼做的......我知道有點麻煩,但我看到有一些關於這方面的討論,也爲這些路由添加了前綴。最好的部分是你的路由在同一個文件中,當他們要在前綴 – eAbi

+0

上添加「預期功能」時,更改它們會很簡單。現在,這不適用於v10 sail.js,因爲config /控制器已棄用 –

0

從版本0.12.x開始,它位於第100行的config/blueprints.js中。如前所述適用相同的規則。該前綴僅適用於藍圖自動漫遊,而不是在config/routes.js中手動創建路由。

/*************************************************************************** * * * An optional mount path for all blueprint routes on a controller, * * including 'rest', 'actions', and 'shortcuts'. This allows you to take * * advantage of blueprint routing, even if you need to namespace your API * * methods. * * * * (NOTE: This only applies to blueprint autoroutes, not manual routes from * * 'sails.config.routes') * * * ***************************************************************************/ // prefix: '', < ----- line 100 in config/blueprints。JS