Почему я не могу передавать функции из Express. js в E JS, как передаю другие переменные? - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над приложением для ведения блога (щелкните ссылку, чтобы увидеть репозиторий GitHub ) с Express, E JS и MongoDB.

Пытаясь разбить посты на страницы, я застрял с передачей newerPosts и olderPosts в представление. Я передаю их так же, как переменную posts (и другие переменные):

exports.getPosts = async (req, res, next) => {
    //pagination params
    var perPage = 10;
    var currPage = req.body.page ? parseInt(req.body.page) : 1;

    const newerPosts = function() {
        currPage = currPage + 1;
        console.log(currPage);
    }

    const olderPosts = function() {
        currPage = currPage - 1;
        console.log(currPage);
    }

    const posts = await Post.find({}, (err, posts) => {
            if (err) {
                console.log('Error: ', err);
            } else {
                res.render('default/index', {
                    moment: moment,
                    layout: 'default/layout',
                    website_name: 'MEAN Blog',
                    page_heading: 'XPress News',
                    page_subheading: 'A MEAN Stack Blogging Application',
                    posts: posts,
                    newerPosts: newerPosts,
                    olderPosts: olderPosts
                });
            }
        })
        .sort({
            created_at: -1
        })
        .skip((currPage - 1) * perPage)
        .limit(perPage)
        .populate('category');
};

В представлении:

    <div class="px-1">
        <a class="btn btn-primary" href="#" onclick=<%="olderPosts()"%>>&larr; Older Posts</a>
    </div>

     <div class="px-1">
        <a class="btn btn-primary" href="#" onclick=<%="newerPosts()"%>>Newer Posts &rarr;</a>
     </div>

Тем не менее, я получаю сообщение об ошибке Uncaught ReferenceError: newerPosts is not defined от браузер.

Что я делаю не так? Какая ближайшая рабочая альтернатива?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Отметьте вот это:

const posts = await Post.find({}, (err, posts) => {
xxxx ... res.render()
})

Я думаю, здесь вам нужно внести некоторые изменения в c logi использования Promise ... Подумайте, что будет, если появится ошибка? где ты это делаешь? и еще интереснее - после результата возврата обещания - где вы выходите из своей функции? ...

0 голосов
/ 08 мая 2020

Вы можете сделать следующее: создать новый файл e js с именем functions.ejs:

<script>
  function test(){console.log(1)}
</script>

, а затем использовать <%- include('functions'); %> внутри шаблона, который вы визуализируете. Используйте его в начале, чтобы функция определялась при ее вызове.

В соответствующем маршруте используйте:

res.render('default/index', {
  ...,
  name: 'test'
});

Внутри вашего шаблона можно делать следующее:

<button onclick="<%=name%>()"> <%= btnText %> </button>

НО, когда я смотрю на функцию, которую вы хотите передать, я вижу, что вы хотите изменить состояние своего приложения, используя currPage = currPage + 1;. Это не сработает, так как как только страница будет отрисована, в html больше нет ссылки на currPage, потому что к тому времени все будет c html.

Если вы хотите сменить страницы et c. вам нужно будет реализовать некоторые логики внешнего интерфейса c.

...