2017-06-15 80 views
2

我一直在尋找如何獲取HTML頁面的基礎URL,以便來自瀏覽器的相對url請求使用該基礎。修改<base>在服務器端動態標記渲染

下面是答案 Defining root of HTML in a folder within the site root folder

當從服務器渲染HTML - 有一個<base>元素添加到HTML的可靠途徑?

HTML文件是自動生成的,我不想手動將<base>標記添加到文件,如果我可以避免它。當頁面呈現時,以某種方式動態地添加它會很好。

因此,這裏是HTML,因爲它主張:

<head> 
    <title>Code coverage report for All files</title> 
    <meta charset="utf-8" /> 
    <link rel="stylesheet" href="prettify.css" /> 
    <link rel="stylesheet" href="base.css" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <style type='text/css'> 
     .coverage-summary .sorter { 
      background-image: url(sort-arrow-sprite.png); 
     } 
    </style> 
</head> 

我想補充與服務器渲染時基本標籤,所以它看起來像:

<head> 
    <title>Code coverage report for All files</title> 
    <meta charset="utf-8" /> 
    <base href="http://localhost:3050/coverage/lcov-report/cdt-now/index.html"> // <<<< 
    <link rel="stylesheet" href="prettify.css" /> 
    <link rel="stylesheet" href="base.css" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <style type='text/css'> 
     .coverage-summary .sorter { 
      background-image: url(sort-arrow-sprite.png); 
     } 
    </style> 
</head> 

這個問題我假設index.html文件不在我的項目的根目錄下:

enter image description here

但是,index.html文件會生成相對路徑請求,如上面<head>中的<link>標記所示。

我目前呈現的頁面是這樣的:

router.get('/', ac.allow('Admin'), function (req, res, next) { 

    let html = path.resolve(__dirname + '/../coverage/lcov-report/cdt-now/index.html'); 

    res.setHeader('content-type', 'text/html'); 
    fs.createReadStream(html).pipe(res); 

}); 
+0

您需要某種模板。你知道Jade,EJS嗎? – sidewinder

+0

就像我在問題中所說的 - 關鍵部分是我不控制文件 - 它是自動生成的 - 我不想手動修改文件,如果我可以避免它。 –

+0

你不需要。 – sidewinder

回答

0

所以辦法做到這一點,使用我目前的代碼流,以瀏覽器的響應,將是:

const replacestream = require('replacestream'); 

    router.get('/', ac.allow('Admin'), function (req, res, next) { 

     let html, val = 'coverage/lcov-report/cdt-now/index.html'; 

     try { 
     html = path.resolve(__dirname + `/../${val}`); 
     fs.existsSync(html) 
     } 
     catch (err) { 
     return next(err); 
     } 

     res.setHeader('content-type', 'text/html'); 
     let replacement = `</title><base href="http://localhost:3050/${val}">`; 

     fs.createReadStream(html).pipe(replacestream('</title>', replacement)).pipe(res); 

    }); 

那是基本的想法。