Express-js ไม่สามารถรับไฟล์คงที่ของฉันทำไม?


308

ฉันได้ลดรหัสของฉันเป็นแอพ Express-js ที่ง่ายที่สุดที่ฉันสามารถทำได้:

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

ไดเรกทอรีของฉันมีลักษณะเช่นนี้:

static_file.js
/styles
  default.css

แต่เมื่อฉันเข้าถึง http://localhost:3001/styles/default.cssฉันได้รับข้อผิดพลาดต่อไปนี้:

Cannot GET / styles /
default.css

ฉันใช้และexpress 2.3.3 node 0.4.7ผมทำอะไรผิดหรือเปล่า?


ตรวจสอบลิงค์ด้านล่างonly4ututorials.blogspot.com/2017/05/…
Dexter

คำตอบ:


491

ลองhttp://localhost:3001/default.cssดู

หากต้องการ/stylesใน URL คำขอของคุณให้ใช้:

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

ดูตัวอย่างในหน้านี้ :

//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
ขอบคุณ. ในฐานะคนที่ยังใหม่กับ Node และ Express, เอกสาร Express ดูเหมือนว่าร่างจนกว่าคุณจะค้นพบว่าการเชื่อมต่อเป็นที่ที่เอกสารตัวกลางอยู่ที่
เนท

4
อ๋อ มันเป็นเครื่องหมายทับหายไปในกรณีของฉัน
borisdiakur

ในกรณีของฉันฉันไม่ได้ตระหนักถึงเส้นทางเมานท์ที่รวมอยู่ในเส้นทางตามที่คุณอธิบายไว้ในตัวอย่างที่สอง ขอบคุณ!
Mike Cheel

ในกรณีที่มีการติดตั้งใหม่คุณควรตรวจสอบว่าโมดูลของคุณติดตั้งอย่างถูกต้อง ( expressjs.com/en/starter/installing.html ) จากนั้นคุณควรตรวจสอบเส้นทางและชื่อไดเรกทอรีของคุณเช่น Giacomo กล่าว;)
Spl2nky

ใช้path.joinเพื่อเอาชนะปัญหาตัวคั่นไดเรกทอรีข้ามแพลตฟอร์มเสมอ path.join (__ dirname, '/')
Doug Chamberlain

35

ผมมีปัญหาเดียวกัน. ฉันได้แก้ไขปัญหาด้วยรหัสต่อไปนี้:

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')));

ตัวอย่างคำขอแบบคงที่:

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

ฉันต้องการทางออกที่ง่ายกว่านี้ มันมีอยู่หรือไม่


ขอบคุณสำหรับการแบ่งปันโซลูชันของคุณโดยไม่คำนึงว่าเหมาะสมหรือไม่ หากคุณต้องการเปิดปัญหาอีกครั้งเพื่อเพิ่มประสิทธิภาพให้ลองโพสต์คำถามใหม่โดยละเอียดถึงสถานการณ์ใหม่ หากเพิ่มประสิทธิภาพวัตถุประสงค์เพียงอย่างเดียวคำถามที่อาจจะดีกว่าที่จะเหมาะดังนั้นตรวจสอบรหัส

15

default.css ควรจะอยู่ที่ http://localhost:3001/default.css

stylesในapp.use(express.static(__dirname + '/styles'));เพียงแค่บอกด่วนที่จะมองในstylesไดเรกทอรีสำหรับแฟ้มแบบคงที่จะให้บริการ มันไม่ (สับสน) จากนั้นเป็นส่วนหนึ่งของเส้นทางที่มีอยู่


3
โดยสิ้นเชิง! ซึ่งเป็นโดยการประชุมใน express.js คุณทำมันใน/publicซึ่งมีcss, js, imgโฟลเดอร์เพื่อให้คุณสามารถhttp://localhost:3001/css/default.css:)
ชุด Sunde

15

งานนี้สำหรับฉัน:

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

9

ใน server.js ของคุณ:

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

คุณได้ประกาศด่วนและแอปแยกกันสร้างโฟลเดอร์ชื่อ 'สาธารณะ' หรือตามที่คุณต้องการและคุณยังสามารถเข้าถึงโฟลเดอร์เหล่านี้ได้ ในเทมเพลต src ของคุณคุณได้เพิ่มพา ธ สัมพัทธ์จาก / public (หรือชื่อของโฟลเดอร์ชะตาของคุณไปยังไฟล์คงที่) ระวังของบาร์บนเส้นทาง


6

สิ่งที่ได้ผลสำหรับฉันคือ:

แทนที่จะเขียน app.use(express.static(__dirname + 'public/images'));ใน app.js ของคุณ

เพียงแค่เขียน app.use(express.static('public/images'));

เช่นลบชื่อไดเรกทอรีรากในเส้นทาง จากนั้นคุณสามารถใช้เส้นทางแบบคงที่ได้อย่างมีประสิทธิภาพในไฟล์ js อื่นตัวอย่างเช่น

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

หวังว่าจะช่วย :)


นี่เป็นการแก้ไขปัญหาของฉัน ในรหัสของฉันเส้นทางไปยัง CSS ทำงานได้ดีแม้จะมีการต่อเชื่อม __dirname (โดยใช้ path.join) ในขณะที่การดึงข้อมูล js ล้มเหลว
Chim

ฉันดีใจที่ช่วย :)
Amir Aslam

5

ฉันใช้ Bootstrap CSS, JS และแบบอักษรในแอปพลิเคชันของฉัน ฉันสร้างโฟลเดอร์ที่เรียกว่าassetในไดเรกทอรีรากของแอพและวางโฟลเดอร์เหล่านี้ไว้ข้างใน จากนั้นในไฟล์เซิร์ฟเวอร์เพิ่มบรรทัดต่อไปนี้:

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

บรรทัดนี้ช่วยให้ผมที่จะโหลดไฟล์ที่อยู่ในassetไดเรกทอรีจากคำนำหน้าเส้นทางที่ชอบ:/assethttp://localhost:3000/asset/css/bootstrap.min.css

ตอนนี้ในมุมมองฉันสามารถรวม CSS และ JS เช่นเดียวกับด้านล่าง:

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

5

เพื่อให้บริการไฟล์คงที่ (css, รูปภาพ, ไฟล์ js) เพียงสองขั้นตอน:

  1. ส่งผ่านไดเรกทอรีของไฟล์ css ไปที่มิดเดิลแวร์ 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. ในการเข้าถึงไฟล์ css หรือรูปภาพเพียงพิมพ์ url http: // localhost: port / filename.cssเช่นhttp: // localhost: 8081 / bootstrap.css

หมายเหตุ:เพื่อเชื่อมโยงไฟล์ css กับ html เพียงแค่พิมพ์<link href="file_name.css" rel="stylesheet">

ถ้าฉันเขียนรหัสนี้

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

ในการเข้าถึงไฟล์คงที่เพียงแค่พิมพ์ url: localhost: port / css / filename.css ex: http: // localhost: 8081 / css / bootstrap.css

หมายเหตุเพื่อเชื่อมโยงไฟล์ css กับ html เพียงเพิ่มบรรทัดต่อไปนี้

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

3

อันนี้ใช้ได้สำหรับฉัน

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

ฉันค้นหาไฟล์ css ของฉันและเพิ่มเส้นทางลงไป:

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

ดูเหมือนว่าจะทำงานแล้ว


ฉันจะไม่แนะนำวิธีนี้เนื่องจากคุณควรใช้ ExpressJS .use()และexpress.static()วิธีการส่งตำแหน่งที่คุณให้บริการไฟล์ของคุณ มิฉะนั้นคุณจะมีเราเตอร์ตัวใดตัวหนึ่งต่อไฟล์ในไดเรกทอรีสาธารณะของคุณและนั่นเป็นค่าใช้จ่ายจำนวนมากที่ต้องดูแล
Sgnl

นี่คือการแก้ไข แต่ฉันไม่คิดว่ามันเหมาะสม หากคุณมีไฟล์ CSS และ JS มากมายคุณจะดูแลมันได้อย่างไร?
arsho

0

นอกเหนือจากด้านบนตรวจสอบให้แน่ใจว่าเส้นทางของไฟล์คงที่เริ่มต้นด้วย / (เช่น ... / assets / css) ... เพื่อให้บริการไฟล์คงที่ในไดเรกทอรีใด ๆ เหนือไดเรกทอรีหลัก (/ main)


2
นอกจากนี้ในสิ่งข้างต้น? ระบุไว้ในคำตอบของคุณ (ให้เครดิตกับคนที่โพสต์ไว้ถ้าคุณต้อง) บ่อยครั้งที่เปลี่ยนลำดับของคำตอบเพื่อให้เห็นคำตอบทั้งหมดและไม่ใช่ลำดับแรก ๆ เราไม่รู้ว่าคุณกำลังพูดถึงเรื่องอะไร
Zachary Kniebel

0

หากการตั้งค่าของคุณ

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

จากนั้น
ใส่ app.js

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

และอ้างถึง style.css ของคุณ: (ในไฟล์. pug บางไฟล์):

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

ทำไมคุณถึงแนะนำขั้นตอนการเปลี่ยนชื่อสาธารณะ -> คงที่ ฉันจะบอกว่าเป็นเพียงข้อมูลเพิ่มเติมสับสน แต่แล้วอีกครั้งร้ายมักจะเป็นสิ่งที่ดี ...
masterxilo

0
  1. สร้างโฟลเดอร์ที่มีชื่อ 'สาธารณะ' ใน
    โฟลเดอร์โครงการ Nodejs
  2. ใส่ไฟล์ index.html ลงในโฟลเดอร์โครงการ Nodejs
  3. ใส่สคริปต์และไฟล์ css ทั้งหมดลงในโฟลเดอร์สาธารณะ
  4. ใช้ app.use( express.static('public'));

  5. และใน index.html เส้นทางที่ถูกต้องของสคริปต์ไปที่<script type="text/javascript" src="/javasrc/example.js"></script>

และตอนนี้ทุกสิ่งทำงานได้ดี


0

ไดเรกทอรีคงที่

ตรวจสอบภาพด้านบน (ไดเรกทอรีคงที่) สำหรับโครงสร้าง 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'))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.