Я пытаюсь создать систему регистрации курсов, используя форму для отправки информации о студентах в базу данных. Я создал экспресс-маршруты для создания новых записей в коллекции mongo по запросу, и он отлично работает, когда я тестирую его с помощью Postman и жестко кодирую JSON, который я хочу отправить в маршрут. Но когда я создал HTML-форму с javascript, которая использует axios для отправки того же JSON на почту, что-то пошло не так. Он успешно передает данные на маршрут, но что-то происходит, когда он останавливается в некоторой точке кода и запускается дважды, выдавая ошибку. Когда я пытаюсь получить все данные из базы данных после этого, появляются записи, которые я разместил, что означает, что они были успешно введены, но проблема все еще остается тем, что я хочу решить.
Это маршрут, который я создал
const express = require("express");
const router = express.Router();
const data = require("../data");
const studentData = data.students;
const courseData = data.courses;
router.post("/", async (req, res) => {
/* new students added by post request in the JSON form
{
"userName": "testUser",
"hashedPass": "testPass",
"profile": {
"lastName": "testLast",
"firstName": "testFirst",
"studentId": 12345678,
"year": 2,
"credits": 0
}
}
*/
try {
const sData = req.body;
const newStudent = await studentData.create(sData.userName,
sData.hashedPass, sData.profile.lastName, sData.profile.firstName,
sData.profile.studentId, sData.profile.year, sData.profile.credits);
res.status(200).json(newStudent);
} catch (e) {
console.log(e);
res.status(400).json({ error: "post /students" });
}
});
А это функция для создания нового ученика
const mongoCollections = require("./mongoCollections");
const students = mongoCollections.students;
const uuid = require("node-uuid");
const create = async (user, pwd, last, first, studentId, year, credits) =>{
const studentCollection = await students();
const id = uuid.v4();
if (!user || typeof(user) !== "string") throw "You must provide a username";
if (!pwd || typeof(pwd) !== "string") throw "You must provide a password";
if (!last || typeof(last) !== "string") throw "You must provide a last name for your student";
if (!first || typeof(first) !== "string") throw "You must provide a first name for your student";
if (!studentId || typeof(studentId) !== "number") throw "You must provide a student ID";
if (!year || typeof(year) !== "number") throw "You must provide a year";
if(credits !== 0){
if (!credits || typeof(credits) !== "number") throw "You must provide number of completed credits";
}
const newstudent = {
_id: id,
userName: user,
hashedPass: pwd,
profile: {
_id: id,
lastName: last,
firstName: first,
studentId: studentId,
year: year,
credits: credits,
finishedCourses: [],
currentCourses: [],
holds: false
}
};
const insertInfo = await studentCollection.insertOne(newstudent);
if (insertInfo.insertedCount === 0) console.log("Could not add student");
const newId = insertInfo.insertedId;
const student = await get(newId);
return student;
};
Все это прекрасно работает, когда я отправляю JSON через Postman или устанавливаю sData = объект, который я хочу передать. Но я создал простую HTML-страницу с формами для отправки данных от клиента, но когда я отправляю форму, происходит нечто странное. Он отправляет объект на маршрут, и маршрут получает его должным образом, то есть, если я в этот момент укажу console.log (sData), он напечатает предоставленную мною информацию. Но тогда он останавливается на линии
const studentCollection = await students();
и, похоже, снова запускает почтовый маршрут, но на этот раз с пустым объектом. В этот момент он продолжается и проходит через весь остальной код и завершается, но все равно, кажется, добавляет правильные данные в коллекцию, но браузер переходит на пустую страницу с ошибкой "{" error ":" post / Students " } "из моего маршрута. Это HTML-код, который я использую.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">
function getForm(){
axios.get('/students');
}
function submitform(){
axios.post('/students',
{
"userName": "testUser",
"hashedPass": "tesPass",
"profile": {
"lastName": "testLast",
"firstName": "testFirst",
"studentId": 12345678,
"year": 2,
"credits": 0
}
}
);
}
</script>
</head>
<body>
<form method="post" action="/students">
<button type="submit" onclick="submitform()">submit</button>
</form>
<form method="get" action="/students">
<button type="submit" onclick="getForm()">submit</button>
</form>
</body>
</html>
Если это поможет, это мой index.js из / маршрутов
const studentRoutes = require("./students");
const courseRoutes = require("./courses");
const express = require("express");
const app = express();
const constructorMethod = app => {
app.use("/students", studentRoutes);
app.use("/courses", courseRoutes);
app.use("*", (req, res) => {
res.status(404).json({ error: "Not found" });
});
};
constructorMethod(app);
module.exports = constructorMethod;
и это мой главный app.js
const express = require("express");
const bodyParser = require("body-parser");
const app = express();
const configRoutes = require("./routes");
const path = require('path');
app.use(bodyParser.json());
app.get("/", (req,res) => {
res.sendFile(path.resolve(__dirname, "index.html"));
});
configRoutes(app);
app.listen(3000, () => {
console.log("We've now got a server!");
console.log("Your routes will be running on http://localhost:3000");
});
Извините, если что-то из этого не известно, я новичок в запросах.
Любая помощь будет отличной.
Я запускаю все это на localhost
Обновление:
Я понял, что попытка опубликовать несколько раз через форму HTML немного меняет проблему. Он передает все данные на маршрут, который создает нового студента и выполняет весь код без проблем. Затем после завершения , похоже, снова запускается с пустым объектом, останавливаясь, когда достигает
const studentCollection = await students();
снова. Он по-прежнему выдает ту же ошибку «{»: «сообщение / студенты»} »ошибка