【问题标题】:How to send data from react to nodejs without localhost?如何在没有本地主机的情况下将数据从反应发送到 nodejs?
【发布时间】:2020-12-07 04:10:17
【问题描述】:

我正在尝试将 reactjs 和 nodejs 应用程序部署到 heroku。 我已经成功部署了前端,但是前端正在使用 localhost 向 nodejs 发送数据,因此当通过 heroku 运行应用程序时,只有前端在工作。

此代码将数据发送到 nodejs。

saveUserJson = (User) =>{
    const url = 'http://localhost:5000/write'
    axios.post(url,User)
    .then(response => {
        //console.log(response);
    });
  }

这是 nodejs 代码(忽略代码中的主机名)。

const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const morgan = require('morgan');
const cors = require('cors');
const jsonData = require('../src/descriptors/bnk48.json')

const app = express();
const port = 5000;
const hostname = '192.168.43.113';

app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cors());

app.get('/',(req,res) => res.status(200).send({
    message: "Server is running..."
}));


const WriteTextToFileSync =  (contentToWrite) => {
    fs.writeFileSync('./src/descriptors/bnk48.json',contentToWrite,(err) =>{
        //console.log(contentToWrite);
        if(err) {
            console.log(err);
        }else {
            console.log('Done writing to file successfully...')
        }
    })
}
const user = {

}
app.post('/write',(req,res,next) =>{
    const user = {
        "name": req.body[0].name,
        "descriptors": req.body[0].descriptors
    }
    jsonData[user.name]=user
    //console.log(req.body[0].descriptors)
    const requestContent = JSON.stringify(jsonData,null,2);
    WriteTextToFileSync(requestContent)
});

app.use((req,res,next) => res.status(404).send({
    message: "Couldn't find specified route that was requested..."
}));

app.listen(port,hostname,()=>{
    console.log(
        `
        !!! server is running..
        !!! Listening for incoming requests on port ${port}
        !!! Server running at http://${hostname}:${port}/
        !!! http://localhost:5000
        `
    )
})

如何更改本地主机,以便在部署时自动选择发送数据的位置?

【问题讨论】:

    标签: javascript node.js reactjs heroku backend


    【解决方案1】:

    如何更改本地主机,以便在部署时自动选择发送数据的位置?

    有几种方法可以做到这一点,但为此目的使用环境变量是很常见的。这些是由环境设置的,您的开发机器是一个环境,而您在 Heroku 上的生产站点是另一个环境。例如,您可以定义环境变量 BACKEND_ROOT_URL 来保存站点的架构和 FQDN,并像这样调用 axios:

    saveUserJson = (User) =>{
        const url = `${process.env.BACKEND_ROOT_URL}/write`
        axios.post(url,User)
        .then(response => {
            //console.log(response);
        });
      }
    

    url 的构建时间值会有所不同,具体取决于您在哪个环境中执行构建。

    可以通过多种方式在本地设置环境变量。在 Bash shell 中,您可以像 export BACKEND_ROOT_URL=http://localhost:5000 一样手动设置它们。不过这很快就会很无聊,所以我建议您查看dotenv,它可以有效地为您处理这个问题。

    Heroku 有自己的方式来处理 envvars 的设置 - 检查 documentation here

    【讨论】:

    • 我需要更改后端代码(nodejs 代码)的任何内容吗?
    • 我自己并不经常部署到 Heroku,所以我真的不知道它如何处理 IP/域名和端口设置。我通常不必在Application.listen() 方法中硬编码hostnameport。该端口通常也以环境变量PORT 的形式出现。如果您的后端代码在部署时不服务请求,我会尝试将listen 方法更改为:app.listen(process.env.PORT || 5000, () => {} 另请参阅this thread
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多