Node.js 尝试获取资源时出现网络错误
我使用React作为前端,Nodejs和express作为后端,当我的应用程序尝试进行API调用时,我出现了这个错误,在本地环境中,它可以完美地工作,但在生产环境中无法工作 我在控制台中有这个:Node.js 尝试获取资源时出现网络错误,node.js,reactjs,api,express,general-network-error,Node.js,Reactjs,Api,Express,General Network Error,我使用React作为前端,Nodejs和express作为后端,当我的应用程序尝试进行API调用时,我出现了这个错误,在本地环境中,它可以完美地工作,但在生产环境中无法工作 我在控制台中有这个: 跨源请求被阻止:同一源策略不允许读取远程资源http://localhost:5000/badges. (原因:CORS请求未成功)。 fron end code api.js const BASE_URL = 'http://localhost:5000'; const delay = ms =
跨源请求被阻止:同一源策略不允许读取远程资源http://localhost:5000/badges. (原因:CORS请求未成功)。
fron end code 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;
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();
从“React”导入React;
导入“./styles/Badges.css”;
从“../images/badge header.svg”导入confLogo;
从“../components/BadgesList”导入徽章列表;
从'react router dom'导入{Link};
从“../api”导入api;
从“../components/PageLoading”导入页面加载;
从“../components/PageError”导入PageError;
从“../components/MiniLoader”导入MiniLoader;
类标记扩展了React.Component{
状态={
加载:对,
错误:null,
数据:未定义
};
componentDidMount(){
这是fetchData();
this.intervalId=setInterval(this.fetchData,5000);
}
组件将卸载(){
clearInterval(此为有效期);
}
fetchData=async()=>{
this.setState({loading:true,error:null});
试一试{
const data=wait api.badges.list();
this.setState({loading:false,data:data});///si todo sale bien se entrega la data en pantalla
}捕获(错误){
this.setState({loading:false,error:error});//desta forma se maneja el error
}
};
render(){
if(this.state.load===true&&!this.state.data){
返回;
}
if(this.state.error){
返回;
}//这是一个眼睛的错误,因为它是一个眼睛
返回(
新徽章
{this.state.loading&&}
);
}
}
导出默认徽章;
服务器端Seed.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;
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();
const fs=require('fs');
const path=require('path');
const faker=要求(“伪造者”);
const md5=需要('md5');
函数createBadges(限制=50){
常量结果=[];
for(设i=0;i
请使用npm包cors。这将解决问题。我正在尝试,但还不起作用。请更具体地说,我发现这可能会导致:尝试访问具有无效证书的https资源将导致此错误//尝试从具有https源的页面访问http资源也将导致此错误。//从Firefox68开始,https页面是不允许访问的,尽管这可能会因为Bug 1488740而改变//服务器没有响应实际请求(即使它响应了飞行前请求)。一种情况可能是正在开发的HTTP服务在没有返回任何数据的情况下惊慌失措。