我将React用于前端,将Nodejs与express用于后端,当我的应用尝试进行API调用时出现此错误,它在本地环境中运行良好,但在生产环境中无法正常工作。
我在控制台中有这个
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/badges. (Reason: CORS request did not succeed).
前端代码api.js
const BASE_URL = 'http://localhost:5000';
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const randomNumber = (min = 0, max = 1) =>
Math.floor(Math.random() * (max - min + 1)) + min;
const simulateNetworkLatency = (min = 30, max = 1500) =>
delay(randomNumber(min, max));
async function callApi(endpoint, options = {}) {
await simulateNetworkLatency();
options.headers = {
'Content-Type': 'application/json',
Accept: 'application/json'
};
const url = BASE_URL + endpoint;
const response = await fetch(url, options);
const data = await response.json();
return data;
}
const api = {
badges: {
list() {
// throw new Error('500 server Error'); // esto ocurre cuando hay un error con la api
// return []; // este seria el caso en donde llega la peticion vacia
return callApi('/badges'); // esta es la llamada exitosa a la api, entregando todos los datos
},
create(badge) {
// throw new Error('500: Server error');
return callApi(`/badges`, {
method: 'POST',
body: JSON.stringify(badge)
});
},
read(badgeId) {
return callApi(`/badges/${badgeId}`);
},
update(badgeId, updates) {
return callApi(`/badges/${badgeId}`, {
method: 'PUT',
body: JSON.stringify(updates)
});
},
// Lo hubiera llamado `delete`, pero `delete` es un keyword en JavaScript asi que no es buena idea :P
remove(badgeId) {
return callApi(`/badges/${badgeId}`, {
method: 'DELETE'
});
}
}
};
export default api;
React Component Badges.js
import React from 'react';
import './styles/Badges.css';
import confLogo from '../images/badge-header.svg';
import BadgesList from '../components/BadgesList';
import { Link } from 'react-router-dom';
import api from '../api';
import PageLoading from '../components/PageLoading';
import PageError from '../components/PageError';
import MiniLoader from '../components/MiniLoader';
class Badges extends React.Component {
state = {
loading: true,
error: null,
data: undefined
};
componentDidMount() {
this.fetchData();
this.intervalId = setInterval(this.fetchData, 5000);
}
componentWillUnmount() {
clearInterval(this.intervalId);
}
fetchData = async () => {
this.setState({ loading: true, error: null });
try {
const data = await api.badges.list();
this.setState({ loading: false, data: data }); // si todo sale bien se entrega la data en pantalla
} catch (error) {
this.setState({ loading: false, error: error }); // de esta forma se maneja el error
}
};
render() {
if (this.state.loading === true && !this.state.data) {
return <PageLoading />;
}
if (this.state.error) {
return <PageError error={this.state.error} />;
} // si llegase a ocurrir un error este es el mensaje que se mostraria en pantalla
return (
<React.Fragment>
<div className="Badges">
<div className="Badges__hero">
<div className="Badges__container">
<img
className="Badges_conf-logo"
src={confLogo}
alt="Conf logo"
/>
</div>
</div>
</div>
<div className="Badges__container">
<div className="Badges__buttons">
<Link to="/badges/new" className="btn btn-primary">
New badge
</Link>
</div>
<div className="Badge__list">
<BadgesList badges={this.state.data} />
{this.state.loading && <MiniLoader />}
</div>
</div>
</React.Fragment>
);
}
}
export default Badges;
服务器端Seed.js
const fs = require('fs');
const path = require('path');
const faker = require('faker');
const md5 = require('md5');
function createBadges(limit = 50) {
const result = [];
for (let i = 0; i < limit; i++) {
const firstName = faker.name.firstName();
const lastName = faker.name.lastName();
const email = faker.internet.email();
result.push({
id: faker.random.uuid(),
firstName,
lastName,
email,
jobTitle: faker.name.jobTitle(),
twitter: `${firstName}${lastName}${faker.address.zipCode()}`,
avatarUrl: `https://www.gravatar.com/avatar/${md5(email)}?d=identicon`,
});
}
return result;
}
function main() {
const data = {
badges: createBadges(),
};
fs.writeFileSync(
path.resolve(__dirname, 'db.json'),
JSON.stringify(data, null, 4)
);
}
main();