Res.sendfile() не поддерживает javascript
Я хочу использовать статический файл без любого механизма рендеринга.
Я пытался использовать:
res.sendfile('public/index.html');
на маршруте '/' GET и выразить промежуточное ПО для статических файлов на моем маршруте:
app.use(express.static(path.join(__dirname, 'public')));
НО, похоже, что все javascripts, которые запрашивает клиент, загружаются с помощью информации о файле index.html.
Как сделать успешную загрузку статических файлов CSS/JS?
UPDATE:
Вот маршрут для файла res.send...:
app.get('/*', index);
Я хочу, чтобы все запросы к серверу на любом маршруте получались index.html
и все его JS & CSS, ассоциированные с.
Ответы
Ответ 1
Я думаю, это могло бы помочь вам...
в файле app.js
...
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use("/styles", express.static(__dirname + '/public/stylesheets'));
app.use("/scripts", express.static(__dirname + '/public/javascripts'));
app.use("/images", express.static(__dirname + '/public/images'));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', function (req, res) {
res.sendfile(__dirname + '/public/home.html');
});
сохраните home.html
внутри папки /public
и файлов JavaScript в /public/javascripts
, изображения в /public/images
, css файлах в папке /public/stylesheets
.
В файле HTML файла должны быть указаны слова, которые вы определяете (например:/ scripts
/home.js)... как этот
<link rel="stylesheet" type="text/css" href="/styles/home.css" >
<script src="/scripts/home.js" type="text/javascript"></script>
Ответ 2
var express=require("express");
var app=express();
app.use('/', express.static(__dirname + '/website/views/'));
app.set("views",__dirname+'/website/views');
app.get("/",function(req,res){
res.sendfile('index.html');
});
приведенные выше коды - мои. Я хочу вам помочь.
Ответ 3
Почему не что-то вроде этого?
if(req.url == '/') { // Root lookups appear to be mapped to index.html
next();
} else {
fname = [disk location of your website] + req.url;
fs.open(fname, 'r', function(err, fd) {
if(err) {
next();
} else {
fs.close(fd);
res.sendfile(fname);
}
});
}
Ответ 4
Ну, самым простым решением будет перемещение app.use(express.static(path.join(__dirname, 'public')))
до вызова app.use(app.router);
Таким образом, статическое промежуточное ПО обслуживается до app.get('/*', index);
Ответ 5
Я сделал предположение, что ваши маршруты объявлены в следующем порядке:
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
Если это действительно так, то имеет место следующее предложение:
Проблема в том, что app.get('/*',...) перехватит все запросы, которые совпадают, и это в основном все. Ваше статическое промежуточное ПО не будет иметь шансов на обслуживание файлов.
Если вы удалите этот маршрут, все должно работать для вас, поскольку index.html
уже находится в каталоге public
и может обслуживаться статическим промежуточным программным обеспечением.
Для хорошего объяснения того, как это работает, см. ответ на этот вопрос: node.js/express.js - Как работает app.router?
Обновление, основанное на дополнениях к вышеуказанному вопросу:
Вы указали это как текущее поведение вашего сервера:
Кажется, что все javascripts, которые запрашивает клиент, загружаются с информацией о файле index.html.
Вы задали вопрос:
Как сделать успешную загрузку статических файлов CSS/JS?
с этим требованием
Я хочу, чтобы все запросы на сервер по любому маршруту получались index.html и все его JS & CSS, ассоциированные с.
Ваш вопрос и требование противоположны друг другу. Сервер отправит обратно клиенту именно то, что вы ему скажете/настроите. Он будет либо всегда отправлять обратно index.html
, что и соответствует вашему требованию, либо успешно выполняет как index.html
, так и любые ссылки на CSS/Javascript, которые являются тем, что было вашим исходным выражением о проблеме.
В одном из ваших комментариев ниже вы заявили:
Причина, по которой я хочу это сделать, заключается в том, что я использую шаблоны, а index.html обертывает каждый шаблон. Я использую angular на клиенте, и я начинаю понимать, что для этого я должен использовать механизм рендеринга. Опять же, мой клиент angular определяет частичный URL-адрес, и когда он отправляет запрос: '/partial/sample', мне нужно, чтобы index.html обертывал 'sample.html', например
Мои предположения, основанные на этом утверждении (пожалуйста, исправьте, если не так)
- Вы используете клиентские шаблоны
- Файлы, которые вы извлекаете с сервера, являются статическими (т.е. они должны быть поданы с сервера , как есть)
- Ваши маршруты в настоящее время объявлены в этом порядке
- app.use(app.router);
- app.use(express.static(путь .join(__ dirname, 'public')));
- Вы не делаете никаких шаблонов на стороне сервера (т.е. где-то где-то находится
public
)
Если эти предположения верны, исправление должно выполнить то, что я изначально предложил, и удалить этот маршрут:
app.get('/*', index);
Если вы это сделаете (если ваши ресурсы правильно указаны):
- ваш
index.html
будет получен, как и с сервера, через статическое промежуточное ПО.
- Каждый файл css/js, на который вы ссылаетесь в index.html, будет возвращен с сервера через статическое промежуточное ПО
- Любые запросы на загрузку файлов шаблонов (например,
sample.html
) будут обслуживаться вашим статическим средним продуктом и возвращаться клиенту без изменений.