首页 > 解决方案 > 如何在 EJS 模板中使用包?

问题描述

我正在尝试在 EJS 模板中使用 timeago.js。我试图像这样导出库:

src/lib/lib.js

 const timeago = require('timeago.js');
    exports.index = function(req, res){
        res.render('links/list',{timeago: timeago});
    }

路线是:routes/links.js

router.get('/', (req, res)=>{
        sequelize.query('SELECT * FROM links', {
            type: sequelize.QueryTypes.SELECT
        }).then((links)=>{
            res.render('links/list', {links: links});
        });
    });

EJS 模板为:views/links/list.ejs

<div class="container p-4">
     <div class="row">
         <% for(i of links){ %>
             <div class="col-md-3">
                 <div class="card text-center">
                     <div class="card-body">
                         <a target="_blank" href="<%= i.url %>">
                             <h3 class="card-title text-uppercase"><%= i.title %></h3>
                         </a>
                         <p class="m-2"><%= i.description %></p>
                         <h1><%= timeago.format(i.created_at); %></h1>
                         <a href="" class="btn btn-danger">Delete Link</a>
                         <a href="" class="btn btn-secondary">Edit</a>
                     </div>
                 </div>
             </div>
     <% } %>

我需要使用 h1 中的库来转换从数据库中获得的时间戳。但是,我总是得到同样的错误:timeago is not defined.

如何正确导出 Timeago 以在 EJS 模板中使用?如果我需要路由文件中的库并通过对象将其发送到 EJS 模板,则效果很好,但当我从另一个文件中导出它时就不行了。

标签: node.jsejstimeago

解决方案


我做了以下测试程序来做一个最小的测试timeago.js

const ejs = require('ejs');
const timeago = require('timeago.js');

let template = `
<% for(i of links){ %>
    <h1> <%- i.created_at %>: <%- timeago.format(i.created_at) %> </h1>
<% } %>
`;

const renderData = {
    links: [
        {
            created_at: new Date()
        }
    ],
    timeago
};
const output = ejs.render(template, renderData);

console.log(output);

输出:

<h1> Mon Sep 07 2020 00:01:57 GMT-0700 (Pacific Daylight Time): just now </h1>

因此,只要您正确地将 timeago 对象传递到您的渲染数据中,它就会起作用。

问题很可能在这里:

router.get('/', (req, res)=>{
        sequelize.query('SELECT * FROM links', {
            type: sequelize.QueryTypes.SELECT
        }).then((links)=>{
            res.render('links/list', {links: links});
        });
    });

您没有传入 timeago 对象的地方。这一行:

res.render('links/list', {links: links});

应该是:

res.render('links/list', {links: links, timeago});

编辑:

使用注释中指定的文件路径的更完整示例:

路线/链接.js:

var express = require('express')
var router = express.Router();

const lib = require("../src/lib/lib");

router.get('/', (req, res)=>{
    lib.index(req, res);
});

module.exports = router;

src/lib/lib.js

const timeago = require('timeago.js');

exports.index = function(req, res) {
    const links = [
        {
            created_at: new Date()
        }
    ];
    res.render('links/list',{ timeago, links });
}

推荐阅读