#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:
С кодом существует ряд проблем.
- В вашем файле EJS не может быть метода PUT в форме. Допустимыми методами для HTML — форм являются GET и POST.
- У вас нет маршрута для обработки отправки формы.
- Express с EJS-это архитектура приложений для визуализации на стороне сервера. Как только вы нажмете «Отправить» в нижней форме, страница будет обновлена. Если вы не хотите полного обновления страницы, вам нужно будет выполнить некоторый JavaScript на стороне клиента.
Я бы предложил пройти обучение по экспресс-форме.