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) будут обслуживаться вашим статическим средним продуктом и возвращаться клиенту без изменений.