Экспресс маршруты для создания новой записи JSON в работе с коллекцией монго, но не при использовании axios для отправки запроса - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь создать систему регистрации курсов, используя форму для отправки информации о студентах в базу данных. Я создал экспресс-маршруты для создания новых записей в коллекции 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(); снова. Он по-прежнему выдает ту же ошибку «{»: «сообщение / студенты»} »ошибка

1 Ответ

0 голосов
/ 26 апреля 2019
    <div>
      <button onclick="submitform()">submit</button>
    </div>
    <div>
      <button  onclick="getForm()">submit</button>
    </div>

Вам не нужен тег form, все операции выполняются onclick,


Почему?Запускается дважды
Функция javascript submitform вызывает POST api.
Также <form action="POST" ... называется POST api

...