2013-03-17 31 views
22

Tôi có đoạn mã sau:phục vụ các tập tin tĩnh với restify (Node.js)

app.js

[...] 

server.get(/\/docs\/public\/?.*/, restify.serveStatic({ 
    directory: './public' 
})); 

server.listen(1337, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

Và tôi có cấu trúc tập tin sau

app.js 
public/ 
    index.html 

Vì vậy, tôi cố gắng duyệt web:

http://localhost:1337/docs/public/index.html 

và tôi nhận được

{ 
    code: "ResourceNotFound", 
    message: "/docs/public/index.html" 
} 

Tôi đã thử với một số biến thể, nhưng không có biến thể nào trong số đó có vẻ hoạt động.

Tôi chắc chắn nó phải được một cái gì đó khá rõ ràng tôi là thiếu

Trả lời

19

restify sẽ sử dụng tùy chọn directory như một tiền tố cho toàn bộ đường dẫn tuyến đường. Trong trường hợp của bạn, nó sẽ tìm kiếm ./public/docs/public/index.html.

+27

Tôi tìm cách khôi phục để được ghi lại một cách khủng khiếp. –

8
  1. Tùy chọn directory là tiền tố cho toàn bộ đường dẫn của bạn.
  2. đường dẫn tương đối không làm việc một cách chính xác trong các phiên bản sau này của Restify (Tôi đã thử nghiệm 2.6.0-3, 2.8.2-3 - và tất cả đều tạo ra các lỗi NotAuthorized)

Giải pháp lúc này là:

server.get(/\/docs\/public\/?.*/, restify.serveStatic({ 
    directory: __dirname 
})); 

Sau đó, các tệp tĩnh của bạn sẽ cần phải ở trong ./docs/public.
(__dirname là một biến toàn cầu có chứa các đường dẫn tuyệt đối của kịch bản bạn đang chạy)

+0

Điều này đã làm cho tôi !! Tùy chọn '__dirname' là chìa khóa! –

+0

Dường như có lỗi cho OSX để tránh sử dụng ./ cú pháp, vì vậy đây là điều duy nhất có hiệu quả đối với tôi. Cảm ơn! –

4

Dựa trên câu trả lời @ NdeeJim, để bất cứ ai tự hỏi làm thế nào để phục vụ TẤT CẢ các tài nguyên tĩnh:

server.get(/\/?.*/, restify.serveStatic({ 
      directory: __dirname, 
      default: 'index.html', 
      match: /^((?!app.js).)*$/ // we should deny access to the application source 
    })); 
+0

giúp tôi rất nhiều lần, cảm ơn –

Các vấn đề liên quan