2017-09-13 31 views
0

我试图使用hapijs + inert pluginhapijs - 从服务目录处理静态文件与可变路径名

{ 
    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参数做这样的事情在我的路线文件需要一个字符串,数组或函数返回一个字符串或数组...在我的情况下,我的函数返回一个承诺...所以它不起作用。 我试过添加hapi-as-promised包,它修改了reply函数来支持then方法,但没有奏效。

基本上我想从一个目录或另一个目录提供静态资产,具体取决于主机头值。

回答

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; 
      } 
     } 
    } 
} 

我不知道是怎么对这种方式,但我测试,它工作。所以我希望这有助于。我必须注意,使用节点到服务器生产文件不是一个常见的方式,由于某种原因。

+0

最后我用了使用url参数播放的reply.file,我猜它使用预处理器方法节省了一些数据库查询,但是当然你的解决方案是有效的。我知道这不是最好的方式,我只是有一个非常奇怪的要求,收到一个HTML文件和资产的zip文件,他们希望通过自定义登陆页面取代项目中的反应应用程序索引路线取决于子域。 ..我不喜欢这个解决方案(既没有这个要求),但是为了获得时间,在这个工作之后立即考虑一个更好的方法。 如果你的方法可能会更好,请警告我。 – Polak

+0

@Polak是啊,看起来像是一个更复杂的方式来做:) – Alexander

+1

但是,如果有人会用我写的方式,不要做延期,而是使用先决条件。 – Alexander

相关问题