繁体   English   中英

Express-充当静态服务器之前先编辑HTML

[英]Express - Edit HTML before serving as static server

在我致电expressApp.use(express.static(path.join(__dirname, '/../frontend/dist'))); 我需要修改html代码。 我基本上需要做的是在两个中间件函数中插入元标记。 我想出了怎么做。 但是通过我的解决方案,我在另一个内部调用了中间件功能。

app.js

let frontend = await fs
  .readFileSync(path.join(__dirname, '/../frontend/dist/index.html'))
  .toString('utf8');

expressApp.use((req, res, next) => {
  //...
  frontend = frontend.replace(
    '<meta device="ABC" />',
    '<head><meta device="' + deviceId + '"/>'
  );
  next();
});

expressApp.use((req, res, next) => {
  const language = req.get('language') || 'en_GB';
  logger.info('language:' + language);
  this._languageModule.setLanguage(language);
  frontend = this._languageModule.insertSIDs(frontend);
  logger.info(frontend);
  expressApp.use(express.static(path.join(__dirname, '/../frontend/dist'))); // nested middleware function
  next();
});

/** set up all the express routes **/
expressApp.get('/', (req, res) => {
  res.send(frontend);
});

编辑

如果我不打电话给expressApp.use(express.static(path.join(__dirname, '/../frontend/dist'))); 嵌套-像这样:

expressApp.use((req, res, next) => {
  const language = req.get('language') || 'en_GB';
  logger.info('language:' + language);
  this._languageModule.setLanguage(language);
  frontend = this._languageModule.insertSIDs(frontend);
  logger.info(frontend);
  next();
});

expressApp.use(express.static(path.join(__dirname, '/../frontend/dist')));

HTML将不会被修改。

您可能应该编写自己的中间件来处理文件的修改。 这是一个未经测试的示例。 但这很粗糙。 它基于express.static函数

const fs = require("fs");
var parseUrl = require('parseurl')

app.use((req, res, next) => {

    var originalUrl = parseUrl.original(req)
    var path = parseUrl(req).pathname

     // make sure redirect occurs at mount
    if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
        path = ''
    }

    // We only answer to GET 
    if (req.method !== 'GET' && req.method !== 'HEAD') {
        return next()
    }

    let path = path;
    fs.exists(path, (exists) => {
        if(!exists)
        {
            // file don't exists skip this middleware
            return next();
        }
        fs.readFile(path, (err, data) => {
            if (err)
            {
                // Can't send the file skip this middle ware
                return next();
            }


            // Do whatever you need with the file here?
            // ...


            // Setup mime type of the file
            res.setHeader("content-type", "text/html");
            // send the client the modified html
            res.send(data);
        });
        console.log(exists ? 'it\'s there' : 'no passwd!');
    });
});

对于原始资源,请查看以下github页面: https : //github.com/expressjs/serve-static/blob/master/index.js

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM