【问题标题】:Getting my React frontend to talk to my Express server让我的 React 前端与我的 Express 服务器对话
【发布时间】:2017-04-17 07:14:07
【问题描述】:

所以我有一个运行 Apache、Node 和 Mongo 的 Digital Ocean Ubuntu VPS。我可以通过服务器上的 CURL 从我的数据库中返回数据。节点后端肯定在 3000 端口上运行。

我的 React 前端使用 Fetch,我目前将它指向 localhost:3000。这是错的吗?

对于我的前端 React 包应该在我的服务器上相对于我的 server.js 的位置,我也有点困惑。这有关系吗?

我可以通过我的域访问前端,只是它不像我在本地处理它时那样抓取数据。我必须在我的 server.js 中遗漏一些东西才能让他们互相交谈......

我读到了 Apache VirtualHost 以及它如何成为在单个 Apache 服务器上运行节点应用程序的必要组件。如果您对此有所了解,请告诉我。

这是来自前端的 httpservice.js 文件:

var Fetch = require('whatwg-fetch');
var baseUrl = 'http://localhost:3000';

var service = {
    get: function(url) {
      return fetch(baseUrl + url)
      .then(function(response)  {
        return response.json();
      });
    },
    post: function(url, ingredient) {
      return fetch(baseUrl + url, {
        headers: {
          'Accept': 'text/plain',
          'Content-Type': 'application/json'
        },
        method: 'post',
        body: JSON.stringify(ingredient)
      }).then(function(response) {
        return response;
      });
    }
  };

module.exports = service;

这是我后端的 server.js:

var express = require('express');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bodyParser = require('body-parser');
var app = express();

mongoose.connect('mongodb://admin:admin123@127.0.0.1:27017/food?authSource=admin');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

var usersSchema = new Schema({
//  _id: String,
  id: String,
  vote: Number
});

var bkyes = mongoose.model('bkyes', usersSchema);

app.get('/bkyes', function(req, res) {
bkyes.find({}, function(err, bkyes) {
  res.send(bkyes);
  });
});

app.listen(3000);

非常感谢您的任何见解,欢迎和赞赏所有人!!!

【问题讨论】:

  • 客户端 index.html 文件如何调用它需要的所有必要的 JavaScript 文件/库?您的问题在这里不是很清楚。
  • 它是一个 React 前端,因此 httpservice.js 文件只定义了在应用程序的其他不相关部分中使用的 GET 和 POST 函数。 index.html 只是一个普通的 index.html,它调用了一个 React bundle.js。
  • 我假设您只在 chrome 的本地主机上运行此程序(客户端和服务器)。当您检查 chrome 中的代码时,您是否在控制台中看到任何错误?网络选项卡上的所有元素是否都正确加载?您的问题到底是什么?
  • 没有一切都在 DigitalOcean VPS 上。当我将var baseUrl = 'http://localhost:3000'; 更改为var baseUrl = 'http://MY_SERVER_IP:3000'; 时,它仍然没有找到任何东西。我将更改我的问题以表明此服务器是不在本地运行的 VPS。我的问题是我错过了什么。感谢您的帮助!

标签: javascript node.js reactjs express


【解决方案1】:

我选择了预配置的 Digital Ocean 服务器,并安装了基本防火墙。由于我的应用程序在端口 3000 上运行,它阻止了 GET 和 POST 请求。我通过在我的服务器上运行它来修复它:

sudo ufw allow 3000

另外,在我的 httpservice.js 文件中,我将 var baseUrl = 'http://localhost:3000'; 更改为:

var baseUrl = 'http://MY_SERVER_IP:3000';

【讨论】:

    【解决方案2】:

    你的服务器在你的本地机器上吗?否则,我认为您应该将域名或其IP地址放在baseURL中。 事实上,当你访问你的前端时,从 React 生成的 js 脚本由你的浏览器在你的本地机器上执行。因此它会尝试访问您计算机上的端口 3000。但是您的节点后端仍在您的服务器上。

    【讨论】:

    • 是的,我试过了,但似乎没有帮助。不过,我可能会再次调查,谢谢。
    • 不要犹豫,打开网络检查器并查看网络选项卡,以查看未加载的页面以及原因。 Express 还会在一个文件中生成日志,该文件位于/home/username/.forever/randomcharacters.log
    • 好吧,那是错误的。我有这些日志是因为我使用了永远的守护进程。我的错。
    • 不,这是个好建议,查看网络选项卡我发现Fetch 在我的 GET 和 POST 请求中失败。现在查看我服务器上的 node_modules 文件夹,看起来 Fetch 模块可能在安装过​​程中失败了;我没看到。谢谢,我会回来报告的。
    • 不,它在那里......仍在寻找中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2017-04-15
    • 2018-03-03
    • 2022-01-11
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多