Использование .затем в ejs с вспомогательной функцией возвращает [обещание объекта]

#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. да, вы, кажется, понимаете, что я пытаюсь сказать! (Используя переменную, которая была передана через рендеринг, вместо вызова функции)