Node.js 静态脚本文件覆盖服务器端呈现的GET方法
存储库- 我正在尝试将我的React应用程序转换为SSR系统。虽然它在本地主机上工作,但在部署到Heroku时会引发应用程序错误。生成日志显示成功,但访问url时会抛出应用程序错误 请参见编辑1,其中我已说明了根错误 应用程序日志-Node.js 静态脚本文件覆盖服务器端呈现的GET方法,node.js,reactjs,heroku,deployment,server-side-rendering,Node.js,Reactjs,Heroku,Deployment,Server Side Rendering,存储库- 我正在尝试将我的React应用程序转换为SSR系统。虽然它在本地主机上工作,但在部署到Heroku时会引发应用程序错误。生成日志显示成功,但访问url时会抛出应用程序错误 请参见编辑1,其中我已说明了根错误 应用程序日志- 2020-09-21T05:23:05.915898+00:00 app[web.1]: npm ERR! rest-countriers@1.0.0 start: `node server/index.js` 2020-09-21T05:23:05.916046+
2020-09-21T05:23:05.915898+00:00 app[web.1]: npm ERR! rest-countriers@1.0.0 start: `node server/index.js`
2020-09-21T05:23:05.916046+00:00 app[web.1]: npm ERR! Exit status 1
2020-09-21T05:23:05.916211+00:00 app[web.1]: npm ERR!
2020-09-21T05:23:05.916335+00:00 app[web.1]: npm ERR! Failed at the rest-countriers@1.0.0 start script.
2020-09-21T05:23:05.916489+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-09-21T05:23:06.005989+00:00 app[web.1]:
2020-09-21T05:23:06.006055+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2020-09-21T05:23:06.006056+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2020-09-21T05_23_05_918Z-debug.log
2020-09-21T05:23:06.234287+00:00 heroku[web.1]: Process exited with status 1
2020-09-21T05:23:06.275353+00:00 heroku[web.1]: State changed from starting to crashed
server/index.js-
require('ignore-styles');
require('@babel/register')({
ignore: [/(node_module)/],
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/transform-runtime']
});
require('./server');
import express from 'express';
import fs from 'fs';
import path from 'path';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import {StaticRouter} from 'react-router-dom';
import App from '../src/App';
const PORT = process.env.PORT || 8080;
const app = express();
app.use(express.static(path.resolve('./build')))
app.get('*', (req, res) => {
fs.readFile(path.resolve('./build/index.html'), 'utf-8', (err, data) => {
if (err) {
console.log(err);
return res.status(500).send('Some error happened');
}
const context = {};
const app = ReactDOMServer.renderToString(
<StaticRouter location={req.url} context={context}>
<App />
</StaticRouter>
)
return res.send(
data.replace(
'<div id="root"></div>',
`<div id="root">${app}</div>`
)
);
});
});
app.listen(PORT, () => {
console.log(`App launched on ${PORT}`);
});
server/server.js-
require('ignore-styles');
require('@babel/register')({
ignore: [/(node_module)/],
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/transform-runtime']
});
require('./server');
import express from 'express';
import fs from 'fs';
import path from 'path';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import {StaticRouter} from 'react-router-dom';
import App from '../src/App';
const PORT = process.env.PORT || 8080;
const app = express();
app.use(express.static(path.resolve('./build')))
app.get('*', (req, res) => {
fs.readFile(path.resolve('./build/index.html'), 'utf-8', (err, data) => {
if (err) {
console.log(err);
return res.status(500).send('Some error happened');
}
const context = {};
const app = ReactDOMServer.renderToString(
<StaticRouter location={req.url} context={context}>
<App />
</StaticRouter>
)
return res.send(
data.replace(
'<div id="root"></div>',
`<div id="root">${app}</div>`
)
);
});
});
app.listen(PORT, () => {
console.log(`App launched on ${PORT}`);
});
我在build文件夹中有index.html、index.css和index.bundle.js。您需要在package.json中添加heroku postbuild命令 您的命令类似于
scripts:{
...
"build": ***,
"heroku-postbuild": "npm install && npm run build",
}
这将运行并安装依赖项,并运行build命令
尝试删除“return”关键字
res.send(
data.replace(
<div id="root"></div>',
<div id="root">${app}</div>`
)
)
res.send(
data.replace(
',
${app}`
)
)
港口应该是
process.env.PORT | 3000
就这样。它现在应该可以工作了。您需要在package.json中添加heroku postbuild命令 您的命令类似于
scripts:{
...
"build": ***,
"heroku-postbuild": "npm install && npm run build",
}
这将运行并安装依赖项,并运行build命令
尝试删除“return”关键字
res.send(
data.replace(
<div id="root"></div>',
<div id="root">${app}</div>`
)
)
res.send(
data.replace(
',
${app}`
)
)
港口应该是
process.env.PORT | 3000
就这样。现在应该可以了。解决了
代码有两个问题-
app.get()
方法没有运行,通过将app.use()
语句移动到前一个语句下方解决了这个问题start
脚本失败,因为我使用@babel/core
作为开发依赖项。因此,我仅将其重新安装为一个依赖项,从而修复了错误app.get()
方法没有运行,通过将app.use()
语句移动到前一个语句下方解决了这个问题start
脚本失败,因为我使用@babel/core
作为开发依赖项。因此,我仅将其重新安装为一个依赖项,从而修复了错误如果有人能向我解释第一点,我将不胜感激虽然我已经有了
postinstall
脚本,虽然我不知道额外的heroku postbuild
可以做什么,但我尝试将它添加到文件中,但仍然得到了应用程序错误。不过这次的日志有点不同。我已经用更新的日志编辑了这个问题,以便为您的解决方案提供帮助。请看一看。我已经编辑了答案,您可以通过更新PORTI来尝试此解决方案。恐怕它仍然不起作用!我已经用最近的日志替换了您的答案日志。请阅读日志!尝试注释RenderToString并返回一些随机字符串。看看它是否有效!您的应用程序在本地环境中运行正常吗?虽然我已经有了postinstall
脚本,而且我不知道额外的heroku postbuild
可以做什么,但我尝试将其添加到文件中,但仍然出现应用程序错误。不过这次的日志有点不同。我已经用更新的日志编辑了这个问题,以便为您的解决方案提供帮助。请看一看。我已经编辑了答案,您可以通过更新PORTI来尝试此解决方案。恐怕它仍然不起作用!我已经用最近的日志替换了您的答案日志。请阅读日志!尝试注释RenderToString并返回一些随机字符串。看看它是否有效!您的应用程序在本地环境中运行正常吗?