2016-03-20 8 views
0

Я хочу обслуживать файлы node_modules в своем приложении для воспроизведения.Play Framework 2.5 serve node_modules files

Но .. когда я сделал это так:

маршруты

GET  /assets/*file     controllers.Assets.versioned(path="/public", file: Asset) 
GET  /node_modules/*file    controllers.Assets.at(path="/node_modules", file) 

и в браузере я напечатал http://localhost:9000/node_modules/angular2/animate.js

я получаю страницу ошибки.

Вот заголовки ответа:

HTTP/1.1 404 Not Found 
Content-Length: 5704 
Content-Type: text/html; charset=utf-8 
Date: Sun, 20 Mar 2016 13:35:58 GMT 

Для запроса

GET /node_modules/angular2/animate.js HTTP/1.1 
Host: localhost:9000 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.37 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4 

В предыдущих версиях игры мы могли бы сказать игру, чтобы посмотреть на новую папку в папке активов через:

playAssetsDirectories < + = baseDirectory/"node_modules"

, но он больше не доступен :(

+0

Должно ли 'path =" node_modules "' быть 'path ="/node_modules "'? – Anton

+0

Хорошая точка, все равно это не работает :( – viniolli

+0

Каталог 'node_modules' должен располагаться прямо рядом с' public', а не внутри него, правильно? – Anton

ответ

1

Если вы не хотите связываться с механизмом активов/маршрутизации в Play, есть один простой способ достичь этого. Здесь я предполагаю, что ваш каталог node_modules находится рядом с каталогом public.

Что вы создаете еще один контроллер, который будет заботиться о дополнительных активов:

package controllers; 

import play.mvc.*; 
import java.io.File; 

public class NodeModulesController extends Controller { 

    public Result at(String filePath) { 
     File file = new File("node_modules/" + filePath); 
     return ok(file, true); 
    } 
} 

В routes файле вы можете использовать вновь созданный контроллер, как это:

GET  /node_modules/*file   controllers.NodeModulesController.at(file) 

Bonus : Вы видите параметр true при вызове метода ok()? Это говорит о том, должен ли файл быть inlined (true) или отправить как приложение (false). Поэтому, если вы создаете какой-то каталог с модулями Node и хотите, чтобы ваши пользователи получили или , загрузите файлы, вы можете просто перевернуть этот параметр (при условии, что вложение файлов правильно обработано браузером и оно отображает «do- вы-хотите-скачать-этот-файл ').

+0

Я реализовал ваше предложение в scala, и он работает! Он чувствует себя немного грязным, но это лучше, чем сломанное приложение :) Любые идеи, почему стандартные активы не работали? – viniolli

+0

TBH Я не совсем уверен, поскольку я еще не пробовал использовать этот чехол с 2.5.x. Однако в SBT вы можете определить каталог для дополнительных ресурсов (http://www.scala-sbt.org/0.13/docs/Howto-Customizing-Paths.HTML # Добавить + в + дополнительный + ресурс + каталог). Это, с другой стороны, означает, что что-то вроде 'unmanagedResourceDirectories в Assets + = baseDirectory.value /" node_modules "' в вашем 'build.sbt' * должно * работать :) – Anton

Смежные вопросы