首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在充当静态服务器之前编辑HTML

在充当静态服务器之前编辑HTML
EN

Stack Overflow用户
提问于 2019-07-16 12:41:00
回答 1查看 2.1K关注 0票数 0

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

app.js

代码语言:javascript
复制
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')));

代码语言:javascript
复制
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不会被修改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-16 13:05:21

您可能应该编写自己的中间件来处理文件的修改。这里有一个没有经过测试的例子。但这很难。它基于express.static函数

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57057525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档