Я пытаюсь сделать простой почтовый запрос в Mongo Db Atlas, используя Node.js, Express.js и Mongoose.js. Я заполняю форму и отправляю запрос, но он продолжает загружаться, ошибок нет, ничего. У кого-нибудь есть идеи?
//Require assets
const express = require('express');
const app = express();
const mongoose = require('mongoose');
let port = 3000;
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const MongoClient = require('mongodb').MongoClient;
const uri = 'mongodb+srv://michael:<PASSWORD-GOES-HERE>@around-town-vsisv.mongodb.net/admin';
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
const collection = client.db('around_town_db').collection('events');
// perform actions on the collection object
client.close();
});
mongoose.Promise = global.Promise;
var eventSchema = mongoose.Schema({
eventName: String,
})
var eventData = mongoose.model('Event', eventSchema);
//Load index page using endpoint
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
//Post using endpoint
app.post('/addevent', (req, res) => {
var userData = {
eventName: req.body.eventName
}
new eventData(userData)
.save()
.then(res => {
res.send('item saved to database');
})
.catch(err => {
res.status(400).send('unable to save to database');
});
});
//Listen on port 3000
app.listen(port, () => {
console.info('Server listening on port ' + port);
});
Ниже представлена простая форма для отправки почтового запроса. Любые идеи о том, что мне не хватает?
<!DOCTYPE html>
<html>
<head>
<title>Add a local event</title>
</head>
<body>
<div class = "app">
<h1>Add an event</h1>
<form method = "post" action = "/addevent">
<label>Enter event Name</label><br>
<input type = "text" name = "eventName" placeholder = "Enter event name..." required>
<input type = "submit" value = "Add Event">
</form>
</div>
</body>
</html>
client.connect - это место, где я подключаюсь к БД. Все работает, пока я не отправлю форму, а затем она будет загружаться бесконечно. Так много старых руководств, мне сложно найти информацию.
Это не подключение mongoose, это подключение драйвера mongodb.
Кроме того, вы закрываете это соединение, как только вы его устанавливаете, даже если оно было правильным.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте что-нибудь вроде "Follow":
app.post('/addevent', (req, res) => {
var userData = new eventData({
eventName: req.body.eventName
})
userData.save()
.then(res => {
res.send('item saved to database');
})
.catch(err => {
res.status(400).send('unable to save to database');
});
});
Нет, это немного другое. Пожалуйста, не опускайте голоса людей, которые пытаются помочь, это просто отговаривает их помогать в будущем.
Ладно, похоже, у вас две проблемы. Во-первых, вы не позволяете самому Mongoose подключаться к вашей базе данных, а во-вторых, вы перезаписываете переменную ответа. Если вы заметили свой обратный вызов .then() в цепочке обещаний userData.save(), вы вызываете эту результирующую переменную res, а также переменную ответа res из обратного вызова маршрута.
Чтобы исправить первую проблему, где-нибудь при запуске приложения выполните однократный вызов (вместо текущего кода MongoClient)
mongoose.connect(uri)
Вы также можете использовать mongoose.createConnection (), если вам нужен более точный контроль над подключением или вам нужно сделать несколько подключений к разным базам данных.
Вторая проблема, ваш обработчик сообщений должен выглядеть так:
//Post using endpoint
app.post('/addevent', (req, res) => {
var userData = {
eventName: req.body.eventName
}
new eventData(userData)
.save()
.then(result => { // note the use of a different variable name
res.send(result); // also, you generally want to send *something* down that lets the user know what was saved. Maybe not the whole object, but this is illustrative and the client will at least need to know something (e.g. the id) to refer to the object by in the future.
})
.catch(err => {
res.status(400).send('unable to save to database');
});
});
Не имеет отношения к вашей проблеме, но большинство людей пишут Express API в стиле RESTful. Если вы хотите следовать этому соглашению, ваши маршруты должны выглядеть примерно так:
GET /events // list the events
GET /events/:eventId // get a single event by ID
POST /events // add a new event
PUT /events/:eventId // update an existing event
DELETE /events/:eventId // remove an event
Спасибо. Вы правы, я пытался подключиться к БД несколькими способами. Я думаю, что основная проблема, с которой я столкнулся, была связана с моей настройкой Mongo DB Atlas. Настроить с помощью бесплатной песочницы mlab.com было намного проще. У меня также была проблема с обещаниями, которую вы отметили выше, я использовал то же имя переменной «res», которое вызывало ошибку в консоли, пока я ее не изменил. Спасибо за помощь, наконец-то все заработало.
Вы когда-нибудь вызывали mongoose.connect ()? Я не вижу этого здесь в вашем коде, но без него (или createConnection ()) вы никогда не будете общаться с MongoDB через Mongoose.