Loopback 使用 lb-mandrill-connector 验证用户:未捕获的 AssertionError:应定义模板名称

Posted

技术标签:

【中文标题】Loopback 使用 lb-mandrill-connector 验证用户:未捕获的 AssertionError:应定义模板名称【英文标题】:Loopback Verify User with lb-mandrill-connector: Uncaught AssertionError: template name should be defined 【发布时间】:2015-10-03 09:06:51 【问题描述】:

我正在尝试通过环回user.verify 方法使用 mandrill 发送电子邮件,但我遇到了这个错误:

Uncaught AssertionError: template name should be defined

我在环回上发现了这个 PR:https://github.com/strongloop/loopback/pull/1517/files

但它似乎没有被合并,因为它会阻止 TravisCI 测试......

从那个 PR,我在我的代码中尝试了这个解决方法:

let options = 
    type: 'email',
    port: '80',
    to: ac.email,
    from: app.get('emailFrom'),
    subject: 'Thanks for registering.',
    verifyHref: verifyHref,
    template: null,
    user: ac
;

var template = loopback.template(path.resolve(__dirname, '../../server/views/verify.ejs'));
options.html = template(options);

但是如果没有指定,环回似乎设置了一个默认模板,有什么建议吗?

我正在运行loopback#2.18

【问题讨论】:

【参考方案1】:

不应该

let options = 
    type: 'email',
    port: '80',
    to: ac.email,
    from: app.get('emailFrom'),
    subject: 'Thanks for registering.',
    verifyHref: verifyHref,
    template: path.resolve(__dirname, '../../server/views/verify.ejs'),
    user: ac
;

user.verify(options, function(err, response) 
    if (err) 
        next(err);
        return;
    

    console.log('> verification email sent:', response);

    // render the response template
    context.res.render('response', 
        title: 'Signed up successfully',
        content: 'Please check your email and click on the verification link before logging in.',
        redirectTo: '/',
        redirectToLinkText: 'Log in'
    );
);

loopback 方法 user.verify 编译和渲染 ejs 模板(通过 loopback.template)并通过 Email 数据源发送电子邮件。不幸的是,您不能提供不同的模板引擎.. 它被硬编码为 ejs。我想使用 nunjucks,所以必须重写 loopback.template 以返回 nunjucks 的渲染方法,以便当从 user.verify 调用 loopback.template 时,它​​可以按预期工作。

【讨论】:

【参考方案2】:

我今天偶然发现了这个问题。 Mandrill 提供内置模板功能,您可以在其中在 mandrill 帐户中提供动态模板并指定要使用 mandrill 连接器填充的变量。提供模板时,template.name 必须存在,否则断言语句将失败。

这直接取自代码:

/** * Send transactional email with options * * Basic options: * * * from: name: "evenemento", email: "crew@evenemento.co" , * to: "hello@evenemento.co", * subject: "Ho ho", * text: "Plain text message", * html: "<b>Html messages</b> put here" * * * Full list of options are available here: * https://mandrillapp.com/api/docs/messages.nodejs.html#method=send * * if option template is set than message will be send as template: * * * from: name: "evenemento", email: "crew@evenemento.co" , * to: "hello@evenemento.co", * subject: "Ho ho", * template: * name: "signup-confirm", * content: * name: "NewUser Name", * accountId: "123456" * * *

【讨论】:

【参考方案3】:

这里的解决方案是不执行user.verify,而是生成令牌,然后调用user.save 并继续调用mandrill。

context.req.app.models.User.generateVerificationToken(user, function (err,token) 
    if (err) 
        return next(err);
    

    user.verificationToken = token;
    user.save(function (err) 
        if (err) 
            next(err);
        
        else 
            var url = 'http://' + config.host + ':' + config.port + '/api/users/confirm?uid=2&redirect=/&token=' + token;
            var mandrill_client = new mandrill.Mandrill('XXXX');

【讨论】:

以上是关于Loopback 使用 lb-mandrill-connector 验证用户:未捕获的 AssertionError:应定义模板名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spi-loopback-test linux 内核模块?

使用 nodemon 启动 Loopback

深入浅出LoopBack系列之一:初尝LoopBack的应用开发

如何使用 keycloak 对 loopback 4 应用程序进行身份验证

loopback 4 使用中间件 prometheus-api-metrics

如何将 body-parser 与 LoopBack 一起使用?