2017-06-15 81 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); 

    }); 

那是基本的想法。