Heroku 服务器 api 调用(本地主机)不工作
Heroku server api call (localhost) not working
我正处于 Web 应用程序的最后阶段,我正在尝试使用 Heroku 部署它。后端非常简单,只使用 express,在我编写代码时,一个简单的本地主机服务器在登录时创建令牌 (localhost:8080/login)。不幸的是,在 Heroku 上,登录和令牌生成将不起作用,除非我正在使用我的计算机并且我的终端中已经有 运行 节点 server.js。也不确定是否需要此上下文,但在本地,我的反应应用程序在 localhost:3000 启动,而服务器是 localhost:8080/login。我听说我应该将它们都更改为相同的本地主机,并对 url 进行一些细微的更改,但到目前为止没有任何效果。我需要对下面的相关代码进行哪些更改,以便 Heroku 将使用自己的服务器进行 api 调用?
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
app.use('/login', (req, res) => {
res.send({
token: 'test123' // simple test send token
});
});
app.listen(8080, () => console.log('API is running on http://localhost:8080/login'));
Server.js(我必须运行 npm start,Ctrl+C,然后节点server.js 为了正确登录)
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import './Login.css';
async function loginUser(credentials) {
return fetch('http://localhost:8080/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(credentials)
})
.then(data => data.json())
}
export default function Login({ setToken }) {
const [username, setUserName] = useState();
const [password, setPassword] = useState();
const handleSubmit = async e => {
e.preventDefault();
const token = await loginUser({
username,
password
});
setToken(token);
}
return(
<div className="login-wrapper">
<h1>Please Log In</h1>
<form onSubmit={handleSubmit}>
<label>
<p>Username</p>
<input type="text" onChange={e => setUserName(e.target.value)} />
</label>
<label>
<p>Password</p>
<input type="password" onChange={e => setPassword(e.target.value)} />
</label>
<div>
<button type="submit">Submit</button>
</div>
</form>
</div>
)
}
Login.propTypes = {
setToken: PropTypes.func.isRequired
};
将生成令牌的登录组件
这是因为您的 Heroku 应用程序的本地主机未指向您的服务器应用程序。
解决这个问题最直接的方法是在 Heroku 上也发布您的服务器应用程序,然后更改您的函数 loginUser
以指向 URL 到您的服务器应用程序的 Heroku URL.您稍后可以重构 URL 以引用环境变量,以便在本地开发和推送到 Heroku 时代码更改为零。在这种情况下,这个 deploy guide 可能会派上用场。
如果您出于任何原因不打算在 Heroku 上发布您的服务器应用程序,您也可以在本地计算机上启动您的服务器并通过 ngrok 公开它,但您需要重构现在获取 URL,因为每次启动时 ngrok 都会有不同的 URL。
我正处于 Web 应用程序的最后阶段,我正在尝试使用 Heroku 部署它。后端非常简单,只使用 express,在我编写代码时,一个简单的本地主机服务器在登录时创建令牌 (localhost:8080/login)。不幸的是,在 Heroku 上,登录和令牌生成将不起作用,除非我正在使用我的计算机并且我的终端中已经有 运行 节点 server.js。也不确定是否需要此上下文,但在本地,我的反应应用程序在 localhost:3000 启动,而服务器是 localhost:8080/login。我听说我应该将它们都更改为相同的本地主机,并对 url 进行一些细微的更改,但到目前为止没有任何效果。我需要对下面的相关代码进行哪些更改,以便 Heroku 将使用自己的服务器进行 api 调用?
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
app.use('/login', (req, res) => {
res.send({
token: 'test123' // simple test send token
});
});
app.listen(8080, () => console.log('API is running on http://localhost:8080/login'));
Server.js(我必须运行 npm start,Ctrl+C,然后节点server.js 为了正确登录)
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import './Login.css';
async function loginUser(credentials) {
return fetch('http://localhost:8080/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(credentials)
})
.then(data => data.json())
}
export default function Login({ setToken }) {
const [username, setUserName] = useState();
const [password, setPassword] = useState();
const handleSubmit = async e => {
e.preventDefault();
const token = await loginUser({
username,
password
});
setToken(token);
}
return(
<div className="login-wrapper">
<h1>Please Log In</h1>
<form onSubmit={handleSubmit}>
<label>
<p>Username</p>
<input type="text" onChange={e => setUserName(e.target.value)} />
</label>
<label>
<p>Password</p>
<input type="password" onChange={e => setPassword(e.target.value)} />
</label>
<div>
<button type="submit">Submit</button>
</div>
</form>
</div>
)
}
Login.propTypes = {
setToken: PropTypes.func.isRequired
};
将生成令牌的登录组件
这是因为您的 Heroku 应用程序的本地主机未指向您的服务器应用程序。
解决这个问题最直接的方法是在 Heroku 上也发布您的服务器应用程序,然后更改您的函数 loginUser
以指向 URL 到您的服务器应用程序的 Heroku URL.您稍后可以重构 URL 以引用环境变量,以便在本地开发和推送到 Heroku 时代码更改为零。在这种情况下,这个 deploy guide 可能会派上用场。
如果您出于任何原因不打算在 Heroku 上发布您的服务器应用程序,您也可以在本地计算机上启动您的服务器并通过 ngrok 公开它,但您需要重构现在获取 URL,因为每次启动时 ngrok 都会有不同的 URL。