#javascript #mysql #node.js #promise
#javascript #mysql #node.js #обещание
Вопрос:
В моем файле ejs я вызываю вспомогательную функцию в другом файле, которая возвращает результат mysql. Проблема в том, что возвращаемое значение равно [обещание объекта], даже когда я использую .then() . Я не уверен, почему.
вспомогательная функция
var conn = require("../routeFunctions/mySqlConn");
//get the amount of likes
var getLikesCountEjs = function(idOfPost) {
var query = getLikeCount(idOfPost).q;
var preparedStatement = getLikeCount(idOfPost).ps;
return new Promise(function (resolve, reject) {
conn.query(query, preparedStatement, function (err, result, fields) {
if (err) {
reject("problem getting likes count");
} else {
resolve(result[0].count);
}
});
});
}
//get all likes count
function getLikeCount(idOfPost) {
var query = "SELECT COUNT(*) as count FROM likes where idOfPost = ?";
var preparedStatement = [parseInt(idOfPost)];
return { ps: preparedStatement, q: query };
}
//you can return multiple functions
module.exports = { getLikesCountEjs : getLikesCountEjs };
файл ejs, в котором я вызываю функцию
<a href="#" class="link-black text-sm interactSetLikesTimeLine" id = "setLikes-<%=posts.id%>">
<i class="far fa-thumbs-up mr-1 initalLoadSetLikes"> Likes <%= asyncFunctions.getLikesCountEjs(posts.id).then(function(result){ console.log(result); }) %> </i>
</a>
Комментарии:
1. Вы должны сделать это на серверной части NodeJS. Как видно здесь , это невозможно (и, на мой взгляд, нецелесообразно)
2. Файлы EJS отображаются с данными, которые вы им передаете. Конечно, они не могут отображать то, что произойдет в будущем. Они не могут отобразить то, что находится в
.then()
, просто потому, что это еще не произошло.
Ответ №1:
Вы не можете использовать async
с EJS, прочитайте эту проблему.
Такие async
методы должны выполняться на серверной части NodeJS, так что у вас есть что-то вроде:
app.get('...', async (req, res) => {
res.render('...', {
data: await asyncFunctions.getLikesCountEjs(posts.id)
})
})
Должно быть достаточно.
Комментарии:
1. могу ли я добавить это в свою вспомогательную функцию?
2. что вы имеете в виду? Просто выполните свою вспомогательную функцию, как то, что у меня примерно есть.
3. ОК. Я очень новичок в node js и асинхронных вещах, поэтому у меня с этим проблемы. Я не уверен, что я прав, но. Когда я вижу app.get, я думаю о своем маршруте. Итак, я думаю.. при запросе маршрута отобразите страницу с моей вспомогательной функцией, загруженной в ejs с «ключевым словом await». Затем в моем ejs обратитесь к данным вместо моей фактической вспомогательной функции. Это позволит мне использовать await в ejs без получения ошибки. Это правильно?
4. извините, я неправильно понял. Я думаю, что теперь я понял
5. да, вы, кажется, понимаете, что я пытаюсь сказать! (Используя переменную, которая была передана через рендеринг, вместо вызова функции)