Как сделать почтовый запрос в mongo db atlas с помощью node.js и express.js

Я пытаюсь сделать простой почтовый запрос в 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>

Вы когда-нибудь вызывали mongoose.connect ()? Я не вижу этого здесь в вашем коде, но без него (или createConnection ()) вы никогда не будете общаться с MongoDB через Mongoose.

Paul 16.12.2018 03:23

client.connect - это место, где я подключаюсь к БД. Все работает, пока я не отправлю форму, а затем она будет загружаться бесконечно. Так много старых руководств, мне сложно найти информацию.

Michael Hicks 16.12.2018 03:33

Это не подключение mongoose, это подключение драйвера mongodb.

Paul 16.12.2018 03:48

Кроме того, вы закрываете это соединение, как только вы его устанавливаете, даже если оно было правильным.

Paul 16.12.2018 03:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
1 029
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте что-нибудь вроде "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');
   });
});

Нет, это немного другое. Пожалуйста, не опускайте голоса людей, которые пытаются помочь, это просто отговаривает их помогать в будущем.

Michael Hicks 16.12.2018 23:34
Ответ принят как подходящий

Ладно, похоже, у вас две проблемы. Во-первых, вы не позволяете самому 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», которое вызывало ошибку в консоли, пока я ее не изменил. Спасибо за помощь, наконец-то все заработало.

Michael Hicks 17.12.2018 01:42

Другие вопросы по теме