production 和 express 中 workbox vuejs 的路由问题

A routing problem with workbox vuejs in production and express

我正在创建一个论坛应用程序来了解 Express 中的 VueRouter。我想做的是在 vuejs 中创建一个路由,然后将其投入生产。当我编译时一切正常。视图文件直接进入 express 中的 public 文件夹,工作几乎完美。我可以完美地改变路线,但是当我从不同的路线触摸 CTRL + F5 到主要路线时,它 returns 一个 GET 错误。

例如这是我的索引并且工作完美:

我什至可以更改路线:

我按 F5 并重新加载页面没有任何问题,但是当我按 CTRL + F5 再次发出请求时,显然它 returns 是一个错误,因为我没有在 express 中声明的路线,

但 vuejs returns 只有一个 html 索引作为视图,我无法渲染任何其他文件,因为它们不存在。

图像中的这些public文件夹是vue通过构建命令创建的文件:

这是我的快速配置:

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersNotifications = require('./routes/notifications');
var usersNotifications = require('./routes/notifications');

var app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/notifications', usersNotifications);

module.exports = app;

这是我在 express 上的索引路线:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index');
});

module.exports = router;

我唯一的选择是渲染 vuejs 提供的唯一索引。我该如何解决?

另一个问题是我不喜欢这些控制台工作箱消息,我怎样才能删除它们使它们永远不会出现:

这是 vuejs registerServiceWorkers.js 文件:

/* eslint-disable no-console */

import { register } from 'register-service-worker'

if (process.env.NODE_ENV === 'production') {
    register(`${process.env.BASE_URL}service-worker.js`, {
      /***
      * Note that here were some methods also display messages 
      * on the console and I deleted them. Methods like
      */
    })
}

有什么想法吗?

由于 vue 路由器正在处理页面路由,您必须为所有请求的路径呈现 index,例如:

router.get('*', function(req, res, next) {
    res.render('index');
});

// in server
app.use('*', indexRouter);

如果您要从服务器公开其他端点,则必须将其安装为最后一个路由中间件,例如,在您的情况下:

app.use('/notifications', usersNotifications);
app.use('*', indexRouter);