在 fastify 中使用通配符路由

Using wildcard routes with fastify

我在 SSR 服务器上工作。我有一个包罗万象的动态路由 - loader 用于所有 GET 请求,我正在使用 fastify-static 来处理其他所有内容。

const main = async () => {
  process.on('unhandledRejection', err => {
    console.error(err);
    process.exit(1);
  });

  const server = fastify({ logger: true });
  server.register(shutdown);

  server.register(compress);
  server.get('/*', fp(loader));
  server.register(require('fastify-static'), {
    root: path.join(__dirname, '../build/static'),
    prefix: '/static'
  });

  const PORT = process.env.PORT || 3000;
  const address = await server.listen(PORT);
  server.log.info(`Server running at: ${address}`);

  server.gracefulShutdown((signal, next) => {
    next();
  });
  module.exports = server;
};

为了fastify-static不和动态路由冲突,我加了前缀。在大多数情况下,这工作正常。然而,它确实给我留下了一些问题:

处理路由的最简单方法是什么:/manifest.json/icon/favicon.ico

我最终得到以下结果:

具有禁用装饰器的静态资产的多个处理程序:

  server.register(require('fastify-static'), {
    root: path.join(__dirname, '../build/static'),
    prefix: '/static',
    decorateReply: false
  });
  server.register(require('fastify-static'), {
    root: path.join(__dirname, '../build/icons'),
    prefix: '/icons',
    decorateReply: false
  });

我的加载程序中 /manifest.json 路由的特殊处理程序:

export default (req, res) => {
   if (req.url === '/manifest.json') {
     fs.readFile(
       path.resolve(__dirname, '../build/manifest.json'),
       'utf8',
       (err, manifest) => {
         // If there's an error... serve up something nasty
         if (err) {
           console.error('Read error', err);

           return res.status(404).end();
         }

         res.send(manifest);
       }
     );
     return;
   }
   ...