2015-01-10 20 views
10

Tôi đang viết một API trên HapiJS và tự hỏi cách nhận tiền tố chung. Ví dụ: tất cả các yêu cầu phải được thực hiện cho:Tiền tố đường dẫn HapiJS toàn cầu

https://api.mysite.com/v0/... 

Vì vậy, tôi muốn định cấu hình tiền tố toàn cầu v0. Các tài liệu (here) dường như không đề cập đến nó - là có một cách tốt để làm điều này trong HapiJS?

Trả lời

13

Nếu bạn đặt logic API định tuyến của bạn bên trong một Hapi plugin, nói ./api.js:

exports.register = function (server, options, next) { 

    server.route({ 
     method: 'GET', 
     path: '/hello', 
     handler: function (request, reply) { 
      reply('World'); 
     } 
    }); 

    next(); 

}; 

exports.register.attributes = { 
    name: 'api', 
    version: '0.0.0' 
}; 

Bạn đăng ký các plugin với một máy chủ và vượt qua một tiền tố tuyến đường bắt buộc, mà sẽ được thêm vào phía trước cho tất cả các tuyến đường của bạn trong các plugin :

var Hapi = require('hapi'); 

var server = new Hapi.Server() 
server.connection({ 
    port: 3000 
}); 

server.register({ 
    register: require('./api.js') 
}, { 
    routes: { 
     prefix: '/v0' 
    } 
}, 
function(err) { 

    if (err) { 
     throw err; 
    } 

    server.start(function() { 
     console.log('Server running on', server.info.uri) 
    }) 

}); 

Bạn có thể xác minh điều này hoạt động bằng cách khởi động máy chủ và truy cập http://localhost:3000/v0/hello.

+2

tôi dường như không thể có được phương pháp làm việc này. Tôi đã có thể thiết lập nó trực tiếp với 'server.realm.modifiers.route.prefix = '/ v0'', nhưng không phải bằng các tùy chọn lồng nhau như bạn hiển thị. Bạn có chắc cách tiếp cận của bạn hoạt động không? – tyler

+1

Có, tôi vừa thử nghiệm nó với Hapi 8. Tùy chọn tiền tố này chỉ có sẵn khi đăng ký một plugin duy nhất. Vì vậy, nếu bạn đang đăng ký nhiều plugin, nó sẽ không hoạt động. –

+3

@MattHarrison Đây có thể là một ý tưởng tốt để cập nhật câu trả lời của bạn với tuyên bố từ chối nhiều plugin :) – Gaston

1

bạn luôn có thể bắt đầu index.js bạn như thế này

if (!global.PREFIX) { 
    global.PREFIX = '/v0'; 
} 

cách này ở khắp mọi nơi bên trong mã của bạn, bạn sẽ có quyền truy cập vào PREFIX

đó là cách bạn có thể truy cập vào PREFIX

console.log(PREFIX); hoặc var name = PREFIX+ "_somename";

3

Matt Harrisson's answerhapi cách để làm điều đó bằng cách sử dụng plugin. Ngoài ra, nếu bạn không muốn tạo plugin chỉ để thêm tiền tố, bạn có thể bằng tay, thêm tiền tố vào tất cả các tuyến đường của mình.

Ví dụ tôi đã đi một cái gì đó như thế này:

var PREFIX = '/v0'; 
    var routes = [/* array with all your root */]; 

    var prefixize = function (route) { route.path = PREFIX + route.path;return route; } 
    server.route(routes.map(prefixize)); 

Tốt điểm là với một cái gì đó như thế này bạn có thể thực hiện express -like gắn. ví dụ:

var prefixize = function (prefix, route) { route.path = prefix + route.path;return route; } 

server.route(adminRoutes.map(prefixize.bind({}, "/admin"))); //currying. 
server.route(apiRoutes.map(prefixize.bind({}, "/api"))); 
+0

Đây là câu trả lời đúng vì câu trả lời của Matt Harrisson không hoạt động đối với nhiều plugin - mà hầu hết mọi người sẽ có. –

4

tôi đã có thể để có được nó làm việc cho tất cả các tuyến với

var server = new Hapi.Server() 
... 
server.realm.modifiers.route.prefix = '/v0' 
server.route(...) 
Các vấn đề liên quan