Я использую следующее form
для отправки данных на мой сервер mongodb.
<form action = "/tasks" method = "post">
<input type = "text" name = "test">
<button>Add Data</button>
</form>
Эта форма подключается к моему запросу POST
через следующее
const express = require('express');
const taskController = require("./controllers/TaskController");
require("./config/db");
const app = express();
const port = 3000;
const path = require('path');
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app
.route("/tasks")
.get(taskController.listAllTasks)
.post(taskController.createNewTask);
...
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../frontend/index.html'));
});
app.listen(port, () => {
console.info(`Listening at port ${port}`);
});
Запросы POST
обрабатываются функцией createNewTask
в моем контроллере.
const Task = require("../models/Task");
...
// Create a new task and save it to database
exports.createNewTask = (req, res) => {
let test = res.json(req.body.test)
let newTask = new Task(test);
console.info(newTask)
newTask.save((err, task) => {
if (err) {
res.status(500).send(err);
}
res.status(201).json(task);
});
};
Контроллер получает следующую схему
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const TaskSchema = new Schema({
taskName: {
type: String,
required: true
},
createdOn: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model("Tasks", TaskSchema);
После просмотра урока я интуитивно понял, что form action = "/tasks"
в index.html
соотносится с app.route("tasks")
в index.js
.
Мой input name = "test"
, кажется, также коррелирует с res.json(req.body.test)
.
Я выбрал res.json
, потому что решил, что мне придется отправлять JSON
данные из ввода вместо строки на сервер.
Однако после того, как я отправлю {"taskName": "lol"}
в свой ввод от http://localhost:3000/
, меня отправят на http://localhost:3000/tasks
со следующим результатом
"{\"taskName\": \"lol\"}"
с ошибкой
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Как мне правильно отправить свои html-данные на сервер?
Мой гитхаб
Вы должны сделать здесь if / else
newTask.save((err, task) => {
if (err) {
res.status(500).send(err);
}
res.status(201).json(task);
});
К этому
newTask.save((err, task) => {
if (err) {
res.status(500).send(err);
}else{
res.status(201).json(task);
}
});
В случае ошибки ваш код сначала отправит ошибку 500, а затем отправит res.status(201).json(task);
Я попытался воспроизвести ошибку, но застрял на другой ошибке. Я клонировал ваш репозиторий и получаю эту ошибку MongooseError: The
uri` параметр для openUri()
должен быть строкой, получил «undefined». Убедитесь, что первым параметром mongoose.connect()
или mongoose.createConnection()
является строка.`
Это потому, что я использую process.env.MONGO_URI
для первого параметра mongoose.connect
, потому что я не хотел раскрывать свои dbname и dbpassword и решил сохранить их в .env
файле, который не отслеживается git через gitignore
о, лол, конечно, у меня есть собственный аккаунт в атласе, тогда я попробую его с этим
Проблема была
let test = res.json(req.body.test)
Это отправляет один ответ на сервер и
res.status(201).json(task);
Отправляет второй ответ. Таким образом, ошибка возникает из-за отправки двух ответов, когда мне разрешен только один.
Переписать код на
exports.createNewTask = (req, res) => {
let newTask = new Task(JSON.parse(req.body.test));
newTask.save((err, task) => {
if (err) {
res.status(500).send(err);
} else {
res.status(201).json(task);
}
});
};
Решает проблему, передавая JSON
жало на вход и преобразовывая его в объект Javascript.
Я попробовал это, и ошибка остается той же.