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 内核模块?
深入浅出LoopBack系列之一:初尝LoopBack的应用开发
如何使用 keycloak 对 loopback 4 应用程序进行身份验证