【发布时间】:2020-12-23 02:59:06
【问题描述】:
文件结构
.root
|-client
| -build
| -node_modules
| -public
| -src
| -components
| -resources
| -data
| -images
| -templates
|-server
| -models
| -public
| -routes
| -server.js
server.js
//Required NPM Packages
const express = require('express'),
app = express(),
cors = require('cors'),
bodyParser = require('body-parser'),
mongoose = require('mongoose'),
methodOverride = require('method-override');
//MongoDB models.
const Product = require('./models/Product');
//Routes.
const indexRoute = require('./routes/index');
const demoRoute = require('./routes/demo');
const bootstrapTemplateRoute = require('./routes/bootstrapTemplate');
//Port.
const _PORT = process.env.PORT || 5000;
//Connect to mongoDB.
mongoose.connect({pathToMongoDB}, {useNewUrlParser:true, useUnifiedTopology:true});
//Setup body-parser.
app.use(bodyParser.urlencoded({extended:true}));
//Allow express/node to accept Cross-origin resource sharing.
app.use(cors());
//Set view engine to EJS.
app.set('view engine', 'ejs');
//Change views to specified directory
app.set('views', path.join(__dirname, '..', 'client','src','Resources','templates'));
app.use(express.static(__dirname+"/public"))
app.use(express.static("client/build"));
app.use(express.static("client/Resources/templates"));
//Setup method override.
app.use(methodOverride("_method"));
//register routes to express.
app.use('/', indexRoute);
app.use('/demo', demoRoute);
app.use('/bootstrapTemplate', bootstrapTemplateRoute)
//listen to established port.
app.listen(_PORT, () => {
console.log(`The server has started on port ${_PORT}!`);
});
module.exports = app;
问题
当我单击后退按钮或在浏览器栏中加载页面时,nodeJS 声明它无法获取该页面。我认识到前端和后端请求是不同的,因为 React-Router 通过它自己的 JavaScript 处理路由,允许零页面重新加载,但是你如何真正解决 nodeJS/Express 上的问题?此外,当我转到 localhost:3000/demo 时,它会从我的 mongoDB 返回数据并以 json 格式呈现,而不是加载正确的页面。
目前正在使用以下 Nginx 基本路由配置开发 MERN 堆栈。
http{
server{
listen 3000;
root pathToRoot/client/build;
location / {
proxy_pass http://localhost:5000/;
}
}
}
events {
}
我相信问题出在我通过 express/nodejs 的路由中。我无法创建明确的特定路线并呈现正确的页面,因为 react 正在为我呈现它。我看了以下问题React-router urls don't work when refreshing or writing manually。我应该做一个全面的并重新路由回主索引页面吗?这似乎会使书签无法使用。
编辑
这是 2 个节点路由。
index.js
const express = require('express'),
router = express.Router();
router.get("/", (req,res) => {
//Render index page.
res.render("index");
});
演示.js
const express = require('express'),
router = express.Router();
const Product = require('../models/Product');
router.get('/:searchInput', (req,res) => {
Product.find({ $text: {$search: req.params.searchInput}}, (err,foundItem) => {
if(err){
console.log(err);
}else{
res.send(foundItem);
}
})
})
router.get('/', (req, res) => {
Product.find({}, (err, foundItem) => {
res.send(foundItem);
});
});
module.exports = router;
【问题讨论】:
-
Does this work for you?我认为问题在于您只为
/路由提供index.html文件,但您想为所有路由提供它。 -
我添加了我目前拥有的两条路线的编辑。我目前只在我们登陆页面时提供 index.html 文件。虽然我很困惑,因为 React 会渲染所有前端页面,所以我需要渲染多个页面。当我路由到演示页面时,会调用 mongo 并取回数据。根据 React useEffect/useState
-
我可能会走得更远,但通常服务器设置为返回 index.html 而不是 404 页面。这样,您可以向服务器询问任何 ol' 路由,如果它不知道,它会返回 React 页面,然后 React-Router DOM 会计算出来。
标签: javascript node.js reactjs express