2017-12-13 15 views
1

私はフロントエンドを行うので、サーバー上で何かをしようとしているときに失われることがあります。私は、サーバーを起動するとexpress.jsのhtml文字列を使用して静的ファイルを提供する

私はこのserver.jsファイル

const express = require('express'); 
const http = require('http'); 
const path = require('path'); 
const logger = require('morgan'); 
const renderPage = require('./layout'); 
const cookieParser = require('cookie-parser'); 
const bodyParser = require('body-parser'); 
const admin = require("firebase-admin"); 

var index = require('./routes/index'); 

// Initialize the Express App 
const app = express(); 

// Apply body Parser and server public assets and routes 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.resolve(__dirname, 'public'))); 


app.use('/', index); 
app.use((req, res, next) => { 
    res 
    .set('Content-Type', 'text/html') 
    .status(200) 
    .end(renderPage()); 
}); 

var server = http.createServer(app); 

// start app 
server.listen(3000); 

module.exports = app; 

..andこの文字列テンプレート

const renderPage = (initialState) => { 
    return ` 
    <!DOCTYPE html> 
    <html> 
     <head> 
      <link href="public/css/main.css"/> 
      <script src="some external javascript"/> 
     </head> 
    <body> 
     <div id="app"></div> 
     <script> 
      window.__INITIAL_STATE__ = ${JSON.stringify(initialState)}; 
     </script> 

    </body> 
</html> 
`; 
}; 

module.exports = renderPage; 

を持って、それは動作しますが、CSSとスクリプトファイルが

を動作しません。

私が間違っていることを見ることができますか?

+0

hrefの 'public'セグメントを指定する必要はありません。 'css/main.css'で十分でしょう。 –

答えて

1

server.jsファイルとパブリックディレクトリが同じレベルにあると仮定すると、path.resolve(__dirname, 'public')はすべての静的リソースが存在するパブリックディレクトリへのフルパスを構築します。 HTMLページ内でこれらのファイルを参照するときは、パブリックディレクトリに対する相対パスを指定します。

<link href="css/main.css"/> 

これでファイルを見つけることができます。ファイルが../public/css/main.cssに存在すると仮定します。

+1

素晴らしい!そのような単純な事のためにあなたが頭痛を覚えるとその気持ち。 – Jachym

+0

おかげでたくさんの仲間:) – Jachym

+0

私のexplantationに満足していますか?つまり、それは意味をなさないのですが、あなたはその問題に遭遇した理由を理解していますか? –

関連する問題