Express-js không thể NHẬN các tệp tĩnh của tôi, tại sao?


308

Tôi đã giảm mã của mình xuống ứng dụng express-js đơn giản nhất tôi có thể thực hiện:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Thư mục của tôi trông như thế này:

static_file.js
/styles
  default.css

Tuy nhiên, khi tôi truy cập, http://localhost:3001/styles/default.csstôi nhận được lỗi sau:

Cannot GET / styles /
default.css

Tôi đang sử dụng express 2.3.3node 0.4.7. Tôi đang làm gì sai?


kiểm tra liên kết bên dưới only4ututorials.blogspot.com/2017/05/ Quảng cáo
Dexter

Câu trả lời:


492

Hãy thử http://localhost:3001/default.css.

Để có /stylesURL yêu cầu của bạn, hãy sử dụng:

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

Nhìn vào các ví dụ trên trang này :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));

42
Cảm ơn bạn. Là một người chưa quen với Node và Express, tài liệu Express có vẻ sơ sài cho đến khi bạn phát hiện ra rằng Connect là nơi chứa các tài liệu phần mềm trung gian.
Nate

4
Vâng. Đó là dấu gạch chéo bị thiếu trong trường hợp của tôi.
boronomiakur

Trong trường hợp của tôi, tôi đã không nhận ra đường dẫn gắn kết được bao gồm trong đường dẫn như bạn đã giải thích trong ví dụ thứ hai. Cảm ơn!
Mike Cheel

Trong trường hợp cài đặt mới, bạn nên xác minh rằng mô-đun express của bạn đã được cài đặt đúng cách ( expressjs.com/en/starter/installing.html ), sau đó bạn nên kiểm tra đường dẫn và tên thư mục của bạn như Giacomo đã nói;)
Spl2nky

luôn luôn sử dụng path.joinđể khắc phục các vấn đề phân tách thư mục nền tảng chéo. path.join (__ dirname, '/')
Doug Chamberlain

35

Tôi có cùng một vấn đề. Tôi đã giải quyết vấn đề với mã sau đây:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Ví dụ yêu cầu tĩnh:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Tôi cần một giải pháp đơn giản hơn. Nó tồn tại?


Cảm ơn bạn đã chia sẻ giải pháp của bạn bất kể nó là tối ưu hay không. Nếu bạn muốn mở lại vấn đề để tối ưu hóa, hãy xem xét đăng một câu hỏi mới nêu chi tiết các tình huống mới. Nếu tối ưu hóa là mục đích duy nhất, câu hỏi có thể phù hợp hơn với Đánh giá mã SO .

15

default.css nên có sẵn tại http://localhost:3001/default.css

Các stylesin app.use(express.static(__dirname + '/styles'));chỉ cho express để tìm trong stylesthư mục cho một tệp tĩnh để phục vụ. Nó không (một cách khó hiểu) sau đó tạo thành một phần của con đường mà nó có sẵn trên đó.


3
Tổng cộng! Đó là theo quy ước trong express.js bạn làm điều đó trên /publicmà có css, js, imgthư mục, do đó bạn có thể http://localhost:3001/css/default.css:)
Kit Sunde

15

Công việc này đối với tôi:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));

9

Trong server.js của bạn:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Bạn đã khai báo express và ứng dụng riêng biệt, tạo một thư mục có tên 'công khai' hoặc tùy thích, nhưng bạn vẫn có thể truy cập vào các thư mục này. Trong src mẫu của bạn, bạn đã thêm đường dẫn tương đối từ / public (hoặc tên của số phận thư mục của bạn vào các tệp tĩnh). Cẩn thận với các thanh trên các tuyến đường.


6

Những gì làm việc cho tôi là:

Thay vì viết app.use(express.static(__dirname + 'public/images'));trong app.js của bạn

Đơn giản chỉ cần viết app.use(express.static('public/images'));

tức là loại bỏ tên thư mục gốc trong đường dẫn. Và sau đó bạn có thể sử dụng đường dẫn tĩnh một cách hiệu quả trong các tệp js khác, Ví dụ:

<img src="/images/misc/background.jpg">

Hi vọng điêu nay co ich :)


Điều này đã giải quyết vấn đề của tôi. Trong mã của tôi, đường dẫn đến CSS đã hoạt động tốt ngay cả với phép nối __dirname (sử dụng path.join), trong khi tìm nạp js không thành công.
Chim

Tôi vui vì điều đó đã giúp :)
Amir Aslam

5

Tôi đang sử dụng Bootstrap CSS, JS và Fonts trong ứng dụng của mình. Tôi đã tạo một thư mục được gọi assettrong thư mục gốc của ứng dụng và đặt tất cả các thư mục này bên trong nó. Sau đó, trong tập tin máy chủ được thêm dòng sau:

app.use("/asset",express.static("asset"));

Dòng này cho phép tôi tải các tệp trong assetthư mục từ /assettiền tố đường dẫn như : http://localhost:3000/asset/css/bootstrap.min.css.

Bây giờ trong các khung nhìn, tôi có thể chỉ cần bao gồm CSS và JS như bên dưới:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">

5

để phục vụ các tệp tĩnh (css, hình ảnh, tệp js) chỉ hai bước:

  1. vượt qua thư mục của các tập tin css để xây dựng trong middleware express.static

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. để truy cập tập tin hoặc hình ảnh css, chỉ cần nhập url http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

Ghi chú: để liên kết các tập tin css với html chỉ cần gõ<link href="file_name.css" rel="stylesheet">

nếu tôi viết mã này

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

để truy cập các tệp tĩnh, chỉ cần nhập url: localhost: port / css / filename.css ex: http: // localhost: 8081 / css / bootstrap.css

lưu ý để liên kết các tập tin css với html chỉ cần thêm dòng sau

<link href="css/file_name.css" rel="stylesheet">    

3

cái này làm việc cho tôi

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));


1

Tôi tìm tập tin css của mình và thêm một tuyến đường vào nó:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Sau đó, nó dường như làm việc.


Tôi sẽ không đề xuất phương pháp này vì bạn nên sử dụng ExpressJS .use()express.static()các phương thức để gửi nơi bạn đang phục vụ các tệp của mình. Nếu không, bạn sẽ có một trong những bộ định tuyến này cho mỗi tệp trong thư mục công cộng của bạn và đó là rất nhiều chi phí phải duy trì.
Sgnl

Đây là một công việc xung quanh nhưng tôi không nghĩ rằng nó là phù hợp. Nếu bạn có nhiều tệp CSS và JS, làm thế nào bạn có thể duy trì nó?
arsho

0

Ngoài ra, hãy đảm bảo đường dẫn tệp tĩnh bắt đầu bằng / (ví dụ ... / nội dung / css) ... để phục vụ các tệp tĩnh trong bất kỳ thư mục nào phía trên thư mục chính (/ main)


2
Ngoài những gì ở trên? Nói nó trong câu trả lời của bạn (cung cấp tín dụng cho người đã đăng nó, nếu bạn phải). SO thường thay đổi thứ tự của các câu trả lời để tất cả các câu trả lời được nhìn thấy và không phải là vài câu đầu tiên. Chúng tôi không biết bạn đang nói về cái gì.
Zachary Kniebel

0

nếu thiết lập của bạn

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

sau đó,
đặt app.js

app.use('/static', express.static('public'));

và tham khảo style.css của bạn: (trong một số tệp .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')

Tại sao bạn lại giới thiệu một bước đổi tên công khai -> tĩnh? Tôi sẽ nói rằng đó chỉ là thông tin thêm khó hiểu. Nhưng sau đó, một lần nữa, sự gián tiếp thường là một điều tốt ...
masterxilo

0
  1. Tạo một thư mục có tên 'công khai' trong
    thư mục dự án Nodejs .
  2. Đặt tệp index.html vào thư mục dự án Nodejs.
  3. Đặt tất cả tập lệnh và tập tin css vào thư mục công cộng.
  4. Sử dụng app.use( express.static('public'));

  5. và trong index.html đường dẫn chính xác của tập lệnh tới<script type="text/javascript" src="/javasrc/example.js"></script>

Và bây giờ tất cả mọi thứ hoạt động tốt.


0

thư mục tĩnh

kiểm tra hình ảnh trên (thư mục tĩnh) cho cấu trúc dir

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
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.