Thiết lập hai thư mục tĩnh khác nhau trong khung node.js Express


101

Nó có khả thi không? Tôi muốn thiết lập hai thư mục khác nhau để phục vụ các tệp tĩnh. Giả sử / public và / mnt


2
Trang này dường như nói rằng điều đó là có thể nhưng không đi sâu vào chi tiết hơn thế.
leek

Câu trả lời:


152

Bạn cũng có thể đặt đường dẫn mà các tệp tĩnh sẽ được phân phát tới web bằng cách chỉ định một tham số bổ sung (đầu tiên) use()như vậy:

app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));

Bằng cách đó, bạn nhận được hai thư mục khác nhau trên web sao chép các thư mục cục bộ của bạn, chứ không phải một đường dẫn url bị lỗi giữa hai thư mục cục bộ.

Nói cách khác, mẫu URL:

http://your.server.com/public/*

Cung cấp tệp từ thư mục cục bộ publictrong khi:

http://your.server.com/public2/*

Cung cấp các tệp từ thư mục cục bộ public2.

BTW điều này cũng hữu ích nếu bạn không muốn tĩnh phân phát các tệp từ thư mục gốc của máy chủ mà từ một đường dẫn đủ điều kiện hơn.

HTH


1
@Facetcounter hoàn hảo! Chỉ cần trỏ một tập lệnh vào thư mục của tôi! script (src = "/ public2 / alertTest.js")
Cody

Nếu sử dụng React và cố gắng cung cấp hai ứng dụng riêng biệt, bạn cần thêm "homepage": "/public""homepage": "/public2"vào package.json của ứng dụng phản ứng tương ứng. Để biết thêm thông tin về cách sử dụng hai ứng dụng phản ứng, hãy xem câu trả lời của tôi tại đây stackoverflow.com/a/48569896/4746648
Danny Harding

điều này rất hữu ích, đặc biệt khi bạn muốn có một sharedthư mục để bạn có thể sử dụng "./""./shared"và bùng nổ, bạn có thể dễ dàng chia sẻ tệp js: 3 Cảm ơn bạn
Jaacko Torus

55

Bạn cũng có thể "hợp nhất" các thư mục thành một thư mục hiển thị duy nhất

Cấu trúc thư mục

  • /static
  • /alternate_static

app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));

Cả static và alternate_static sẽ được phục vụ như thể chúng nằm trong cùng một thư mục. Tuy nhiên, hãy chú ý đến những phần mềm làm nghẽn tên tệp.


6
Nếu tôi hiểu đúng thì xung đột tên tệp không xảy ra vì nút sử dụng phiên bản đầu tiên của tệp mà nó tìm thấy. Nếu nó nhìn thấy main.jstrong static/nó sẽ không tiếp tục nhìn vào alternate_static/.
RobW

2
Đó vẫn là một điều khó hiểu nếu bạn mong đợi tệp trong đó alternate_staticsẽ được phục vụ.
Randolpho

41

Không thể thực hiện bằng một lần tiêm phần mềm trung gian, nhưng bạn có thể tiêm staticphần mềm trung gian nhiều lần:

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});

Giải trình

Xem kết nối / lib / middleware / static.js # 143 :

path = normalize(join(root, path));

Có một options.rootgốc tĩnh, mà bạn xác định trong express.statichoặc connect.staticgọi, và pathlà đường dẫn yêu cầu.

Xem thêm tại connect / lib / middleware / static.js # 154 :

  fs.stat(path, function(err, stat){
    // ignore ENOENT
    if (err) {
      if (fn) return fn(err);
     return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
       ? next()
       : next(err);

Đường dẫn chỉ được kiểm tra một lần và nếu không tìm thấy tệp, yêu cầu được chuyển đến phần mềm trung gian tiếp theo.

Cập nhật cho Connect 2.x

Các liên kết tới mã không thực tế đối với Connect 2.x, nhưng việc sử dụng nhiều phần mềm trung gian tĩnh vẫn có thể xảy ra như trước đây.


0
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;

var app = express();

app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath)); 

app.get('/',(request,response)=>{
    response.send('Hello CSS!!!');
  });

app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});

});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);

});

// folder structure
/cheatsheet/index.html
/stylesheet/style.css
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.