Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 静态脚本文件覆盖服务器端呈现的GET方法_Node.js_Reactjs_Heroku_Deployment_Server Side Rendering - Fatal编程技术网

Node.js 静态脚本文件覆盖服务器端呈现的GET方法

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+

存储库-

我正在尝试将我的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+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()
    语句移动到前一个语句下方解决了这个问题
  • 然而,我仍然不太明白为什么会这样,因为我认为中间件仍然会在route方法中的回调函数之前运行。如果你知道这里发生了什么,请通过评论让我知道

  • 第二个问题导致
    start
    脚本失败,因为我使用
    @babel/core
    作为开发依赖项。因此,我仅将其重新安装为一个依赖项,从而修复了错误
  • 如果有人能向我解释第一点,我将不胜感激

    已解决

    代码有两个问题-

  • 第一个问题是,
    app.get()
    方法没有运行,通过将
    app.use()
    语句移动到前一个语句下方解决了这个问题
  • 然而,我仍然不太明白为什么会这样,因为我认为中间件仍然会在route方法中的回调函数之前运行。如果你知道这里发生了什么,请通过评论让我知道

  • 第二个问题导致
    start
    脚本失败,因为我使用
    @babel/core
    作为开发依赖项。因此,我仅将其重新安装为一个依赖项,从而修复了错误

  • 如果有人能向我解释第一点,我将不胜感激

    虽然我已经有了
    postinstall
    脚本,虽然我不知道额外的
    heroku postbuild
    可以做什么,但我尝试将它添加到文件中,但仍然得到了应用程序错误。不过这次的日志有点不同。我已经用更新的日志编辑了这个问题,以便为您的解决方案提供帮助。请看一看。我已经编辑了答案,您可以通过更新PORTI来尝试此解决方案。恐怕它仍然不起作用!我已经用最近的日志替换了您的答案日志。请阅读日志!尝试注释RenderToString并返回一些随机字符串。看看它是否有效!您的应用程序在本地环境中运行正常吗?虽然我已经有了
    postinstall
    脚本,而且我不知道额外的
    heroku postbuild
    可以做什么,但我尝试将其添加到文件中,但仍然出现应用程序错误。不过这次的日志有点不同。我已经用更新的日志编辑了这个问题,以便为您的解决方案提供帮助。请看一看。我已经编辑了答案,您可以通过更新PORTI来尝试此解决方案。恐怕它仍然不起作用!我已经用最近的日志替换了您的答案日志。请阅读日志!尝试注释RenderToString并返回一些随机字符串。看看它是否有效!您的应用程序在本地环境中运行正常吗?