Почему app.put() не обновляет документы в mongodb?

#javascript #mongodb #express #routes #ejs

Вопрос:

Я пытаюсь реализовать форму в файле ejs, в которой при нажатии кнопки атрибут «нравится» отображаемого документа из моей коллекции MongoDB устанавливается в 0 с помощью запроса «ПОМЕСТИТЬ». Однако рассматриваемый документ не обновляется, и я не знаю, почему.

Консоль не отображает никаких ошибок.

 <!--This file is called "home.ejs"-->

<!--This is to display the document:-->
      <form action="/" method="GET">
            <h3> MONGO FETCHED: </h3>
            <ul>
                <li>
                    <span><%= numbers.usertext %></span>
                    <h3><%= numbers.likes%></h3>
                </li>
            </ul>
        </form>

<!--Upon clicking the button "upvote", it is suppose to tell index.js 
to update the "likes" attribute of the displayed document and set it to 0. 
However, it does nothing-->
        <div>
            <form action="/" method="PUT">
                <button id="upvote" type="submit">upvote</button>
            </form>
        </div>
 

В моем index.js файл, я выбираю случайный документ из своей коллекции для отображения пользователю. Я определил синтаксический анализатор тела, поэтому я знаю, что проблема не в этом.

 MongoClient.connect(DBconnection, { useUnifiedTopology: true})
    .then(client => {
    console.log(`Connected to database: ${database}`);
    console.log(`Connected to table: ${table}`);

    app.use(bodyParser.urlencoded({ extended: true }));
    app.set('views', './views');
    app.set('view engine', 'ejs');

    const db = client.db(database);
    const collection = db.collection(table);    
            
    const w = db.collection(table).find().limit(-1).skip(R-1).next()
    //variable R has been defined as a random number

//This gets the fetched random document, w, and then renders it on home.ejs
    app.get('/', (req, res) => {
        w
        .then(numbers => {
          res.render("home.ejs", { numbers: numbers});
        })
        .catch(error => console.error(error));
    })

//This route submits information into the database from a file separate from home.ejs
    app.post(`/${table}`, (req, res) => {
        collection.insertOne(req.body)
        .then(result => {
            res.redirect('/')
        })
        .catch(error => console.error(error))
    });

//This is suppose to update the attribute "likes" from the document w (as defined earlier)
//and set it to 0. However, this code block does not do so.
    app.put(`/${table}`, (req, res) => {
        db.collection(table).findOneAndUpdate({w}, {$set: {likes: "0"} })
        .then(result => {
            console.log("updated succesfully");
        })
        .catch(error => console.error(error))
    });


});
 

Я был бы признателен за любой вклад. Спасибо.

Комментарии:

1. поскольку он не обновляется, вы получаете вместо этого сообщение об ошибке?

2. Нет, в консоли не получено никакой ошибки

Ответ №1:

С кодом существует ряд проблем.

  1. В вашем файле EJS не может быть метода PUT в форме. Допустимыми методами для HTML — форм являются GET и POST.
  2. У вас нет маршрута для обработки отправки формы.
  3. Express с EJS-это архитектура приложений для визуализации на стороне сервера. Как только вы нажмете «Отправить» в нижней форме, страница будет обновлена. Если вы не хотите полного обновления страницы, вам нужно будет выполнить некоторый JavaScript на стороне клиента.

Я бы предложил пройти обучение по экспресс-форме.