hapijs - 使用可变路径名从目录处理程序提供静态文件

时间:2017-09-13 23:36:57

标签: node.js hapijs

我正在尝试使用hapijs + inert plugin

在我的路线文件中执行此类操作
{
  method: 'GET',
  path: '/l/{path*}',
  handler: {
    directory: {
      path: (req) => {
        const defaultDir = '/public';
        return getHostInfo(req.headers.host).then((d) => {
          if (!d || !d.directory) return defaultDir;
          return d.directory;
        }).catch((e) => {
          return defaultDir;
        });
      }
    }
  }
},

path参数需要一个返回字符串或数组的字符串,数组或函数......在我的例子中,我的函数返回一个promise ...所以它不起作用。 我尝试添加hapi-as-promised包来修改reply函数以支持then方法但不起作用。

基本上我想根据主机头值从一个目录或另一个目录提供静态资产。

1 个答案:

答案 0 :(得分:0)

嗯,我脑子里唯一想到的就是这个黑客。首先,你必须制作一个扩展点来制作异步内容:

server.ext({
    type: `onPreHandler`,
    method: (request, reply) => {
        const defaultDir = '/public';
        return getHostInfo(request.headers.host).then((d) => {
            if (!d || !d.directory) {
                request.app.dirPath = defaultDir;
                return;
            }
            request.app.dirPath = d.directory;
        }).catch((e) => {
            request.app.dirPath = defaultDir;
        }).then(() => {
            return reply.continue();
        });
    }
});

然后是路线:

{
    method: `get`,
    path: `/l/{path*}`,
    handler: {
        directory: {
            path: (request) => {
                return request.app.dirPath;
            }
        }
    }
}

我不知道这种方式是对的,但我测试过并且有效。所以我希望这会有所帮助。我必须注意到,出于某种原因,在生产中使用节点到服务器文件并不常见。