我使用react和node.js创建了一个简历生成器网站,在提交详细信息时遇到了这个错误。它开始加载页面并给出“xhr加载失败& Axios错误”?我如何克服这个问题?而且我已经进入openAI,它似乎没有给出错误。我认为Axios是这里的问题,它阻止页面提交详细信息并加载最终结果
Home.js
import React, { useState } from "react";
import { useNavigate } from "react-router-dom";
import Loading from "./Loading";
import axios from "axios";
const Home = ({ setResult }) => {
const [fullName, setFullName] = useState("");
const [currentPosition, setCurrentPosition] = useState("");
const [currentLength, setCurrentLength] = useState(1);
const [currentTechnologies, setCurrentTechnologies] = useState("");
const [headshot, setHeadshot] = useState(null);
const [companyInfo, setCompanyInfo] = useState([{ name: "", position: "" }]);
const [loading, setLoading] = useState(false);
const navigate = useNavigate();
const handleAddCompany = () =>
setCompanyInfo([...companyInfo, { name: "", position: "" }]);
const handleRemoveCompany = (index) => {
const list = [...companyInfo];
list.splice(index, 1);
setCompanyInfo(list);
};
const handleUpdateCompany = (e, index) => {
const { name, value } = e.target;
const list = [...companyInfo];
list[index][name] = value;
setCompanyInfo(list);
};
const handleFormSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
formData.append("headshotImage", headshot, headshot.name);
formData.append("fullName", fullName);
formData.append("currentPosition", currentPosition);
formData.append("currentLength", currentLength);
formData.append("currentTechnologies", currentTechnologies);
formData.append("workHistory", JSON.stringify(companyInfo));
axios.post("http://localhost:4000/resume/create", formData, {})
.then((res) => {
if (res.data.message) {
setResult(res.data.data);
navigate("/resume");
}
})
.catch((err) => console.error(err));
setLoading(true);
};
if (loading) {
return <Loading />;
}else {
return (
<div className='app'>
<h1>Resume Builder</h1>
<p>Generate a resume with ChatGPT in few seconds</p>
<form
onSubmit={handleFormSubmit}
method='POST'
encType='multipart/form-data'
>
<label htmlFor='fullName'>Enter your full name</label>
<input
type='text'
required
name='fullName'
id='fullName'
value={fullName}
onChange={(e) => setFullName(e.target.value)}
/>
<div className='nestedContainer'>
<div>
<label htmlFor='currentPosition'>Current Position</label>
<input
type='text'
required
name='currentPosition'
className='currentInput'
value={currentPosition}
onChange={(e) => setCurrentPosition(e.target.value)}
/>
</div>
<div>
<label htmlFor='currentLength'>For how long? (year)</label>
<input
type='number'
required
name='currentLength'
className='currentInput'
value={currentLength}
onChange={(e) => setCurrentLength(e.target.value)}
/>
</div>
<div>
<label htmlFor='currentTechnologies'>Technologies used</label>
<input
type='text'
required
name='currentTechnologies'
className='currentInput'
value={currentTechnologies}
onChange={(e) => setCurrentTechnologies(e.target.value)}
/>
</div>
</div>
<label htmlFor='photo'>Upload your headshot image</label>
<input
type='file'
name='photo'
required
id='photo'
accept='image/x-png,image/jpeg'
onChange={(e) => setHeadshot(e.target.files[0])}
/>
<h3>Companies you've worked at</h3>
{companyInfo.map((company, index) => (
<div className='nestedContainer' key={index}>
<div className='companies'>
<label htmlFor='name'>Company Name</label>
<input
type='text'
name='name'
required
onChange={(e) => handleUpdateCompany(e, index)}
/>
</div>
<div className='companies'>
<label htmlFor='position'>Position Held</label>
<input
type='text'
name='position'
required
onChange={(e) => handleUpdateCompany(e, index)}
/>
</div>
<div className='btn__group'>
{companyInfo.length - 1 === index && companyInfo.length < 4 && (
<button id='addBtn' onClick={handleAddCompany}>
Add
</button>
)}
{companyInfo.length > 1 && (
<button
id='deleteBtn'
onClick={() => handleRemoveCompany(index)}
>
Del
</button>
)}
</div>
</div>
))}
<button>CREATE RESUME</button>
</form>
</div>
);
}
};
export default Home;
index.js(服务器)
const { Configuration, OpenAIApi } = require("openai");
const express = require("express");
const multer = require("multer");
const path = require("path");
const cors = require("cors");
const fs = require("fs");
const app = express();
const PORT = 4000;
app.use(express.urlencoded({ extended: true }));
app.use("/uploads", express.static("uploads"));
app.use(express.json());
app.use(cors());
const generateID = () => Math.random().toString(36).substring(2, 10);
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads");
},
filename: (req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname));
},
});
const upload = multer({
storage: storage,
limits: { fileSize: 1024 * 1024 * 5 },
});
const configuration = new Configuration({
apiKey: "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",
});
const openai = new OpenAIApi(configuration);
const database = [];
const ChatGPTFunction = async (text) => {
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: text,
temperature: 0.6,
max_tokens: 250,
top_p: 1,
frequency_penalty: 1,
presence_penalty: 1,
});
return response.data.choices[0].text;
};
app.post("/resume/create", upload.single("headshotImage"), async (req, res) => {
const {
fullName,
currentPosition,
currentLength,
currentTechnologies,
workHistory,
} = req.body;
const workArray = JSON.parse(workHistory);
const newEntry = {
id: generateID(),
fullName,
image_url: `http://localhost:4000/uploads/${req.file.filename}`,
currentPosition,
currentLength,
currentTechnologies,
workHistory: workArray,
};
const prompt1 = `I am writing a resume, my details are \n name: ${fullName} \n role: ${currentPosition} (${currentLength} years). \n I write in the technolegies: ${currentTechnologies}. Can you write a 100 words description for the top of the resume(first person writing)?`;
const prompt2 = `I am writing a resume, my details are \n name: ${fullName} \n role: ${currentPosition} (${currentLength} years). \n I write in the technolegies: ${currentTechnologies}. Can you write 10 points for a resume on what I am good at?`;
const remainderText = () => {
let stringText = "";
for (let i = 0; i < workArray.length; i++) {
stringText += ` ${workArray[i].name} as a ${workArray[i].position}.`;
}
return stringText;
};
const prompt3 = `I am writing a resume, my details are \n name: ${fullName} \n role: ${currentPosition} (${currentLength} years). \n During my years I worked at ${
workArray.length
} companies. ${remainderText()} \n Can you write me 50 words for each company seperated in numbers of my succession in the company (in first person)?`;
const objective = await ChatGPTFunction(prompt1);
const keypoints = await ChatGPTFunction(prompt2);
const jobResponsibilities = await ChatGPTFunction(prompt3);
const chatgptData = { objective, keypoints, jobResponsibilities };
const data = { ...newEntry, ...chatgptData };
database.push(data);
res.json({
message: "Request successful!",
data,
});
});
app.listen(PORT, () => {
console.log(`Server listening on ${PORT}`);
});
App.js
import React, { useState } from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./components/Home";
import Resume from "./components/Resume";
const App = () => {
const [result, setResult] = useState({});
return (
<div>
<BrowserRouter>
<Routes>
<Route path='/' element={<Home setResult={setResult} />} />
<Route path='/resume' element={<Resume result={result} />} />
</Routes>
</BrowserRouter>
</div>
);
};
export default App;
Loading.js
import React from "react";
const Loading = () => {
return (
<div className='app'>
<h1>Loading, please wait...</h1>
</div>
);
};
export default Loading;
1条答案
按热度按时间1cosmwyk1#
问题不在React代码中,而是在
http://localhost:4000/resume/create
中此端点以错误响应,控制台中错误显示为红色的原因是您正在使用
console.error(err)
而不是console.log(err)
您需要首先为端点使用调试器,如https://insomnia.rest/或https://www.postman.com/