带有静态HTML的Node + Express.如何将所有请求路由到index.html?

JPo*_*ock 39 javascript node.js express

我正在使用Node + Express和Handlebars进行模板化的单页Web应用程序.目前一切都运行良好,从index.html,从一个非常标准的server.js文件提供:

var express = require('express');

var server = express();
server.use(express.static(__dirname + '/public'));

var port = 10001;
server.listen(port, function() {
    console.log('server listening on port ' + port);
});
Run Code Online (Sandbox Code Playgroud)

加载时,这非常有效http://localhost:10001/.我的问题是我在应用程序中使用推送状态,因此浏览器可能会显示类似的URL http://localhost:10001/foo/bar,然后如果我刷新页面,我会收到错误,Cannot GET /foo/bar因为没有此路径.

所以我的问题,请原谅我在Node上的令人难以置信的无声,我可以这样做所有请求路由到index.html吗?我的应用中的JavaScript可以根据页面加载时的URL参数显示正确的内容.我不想定义自定义路由,因为数字会很大,并且它们的路径可以动态更改.

cdo*_*ock 40

const express = require('express')
const server = express()

/* route requests for static files to appropriate directory */
server.use('/public', express.static(__dirname + '/static-files-dir'))

/* other routes defined before catch-all */
server.get('/some-route', (req, res) => {
  res.send('ok')
})

/* final catch-all route to index.html defined last */
server.get('/*', (req, res) => {
  res.sendFile(__dirname + '/index.html');
})

const port = 8000;
server.listen(port, function() {
  console.log('server listening on port ' + port)
})
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是**全部路由应该在静态中间件和其他获取路由之后,如其他答案中所指出的那样. (3认同)

Nic*_*lin 8

在到达为前端应用程序提供服务的全面途径之前,此模式将为静态资产提供服务。要注册其他路线,只需将它们添加到全部路线上方即可。

var express = require('express');
var server = express();

// middleware
server.use(express.static(__dirname + '/public'));

// routes
server.use('*', function (req, res) {
  // serve file
});

var port = 10001;
server.listen(port, function() {
  console.log('server listening on port ' + port);
});
Run Code Online (Sandbox Code Playgroud)


小智 7

var app = express();

var options = {
  dotfiles: 'ignore',
  etag: true,
  extensions: ['htm', 'html'],
  index: 'index.html',
  lastModified: true,
  maxAge: '1d',
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
    res.header('Cache-Control', 'public, max-age=1d');
  }
};

app.use(compression());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride());

app.use('/', express.static(__dirname + '/public', options));
app.use('*', express.static(__dirname + '/public', options));
Run Code Online (Sandbox Code Playgroud)


Zit*_*tRo 6

这个简短的事情将起作用:

import express from "express";

const app = express(),
      staticServe = express.static(`${ __dirname }/public`);

app.use("/", staticServe);
app.use("*", staticServe);
Run Code Online (Sandbox Code Playgroud)

只需确保HTML / JS文件中的所有URL现在都是绝对URL,因为所有不存在的资源都将返回index.html文件。

Express v 4.15.2


vod*_*095 3

var express = require('express');

var server = express();
server.use(express.static(__dirname + '/public'));

server.get('*', function(req, res){
  res.sendFile('index.html');
});

var port = 10001;
server.listen(port, function() {
    console.log('server listening on port ' + port);
});
Run Code Online (Sandbox Code Playgroud)