Node.js集成Brevo API遇TypeError:ApiClient构造/instance未定义问题
问题描述
我正在开发自动邮件发送程序,用户提交姓名、邮箱等信息后,要给指定邮箱发「已订阅」邮件。参考Brevo官方文档写代码后碰到两个错误:
- 执行
new brevo.ApiClient()时,报错TypeError: brevo.ApiClient is not a constructor - 改成
brevo.ApiClient.instance后,又报错TypeError: Cannot read properties of undefined (reading 'instance')
业务代码
app.post('/submit', (req, res) => { const { name, email, subject , sender , to} = req.body; let defaultClient = new brevo.ApiClient(); let apiKey = defaultClient.authentications['api-key']; apiKey.apiKey = 'API_KEY'; let apiInstance = new Brevo. TransactionalEmailsApi(); let sendSmtpEmail = new Brevo. SendSmtpEmail(); sendSmtpEmail.to = [{ email: email, name: name }]; sendSmtpEmail.templateId = 59; sendSmtpEmail.params = { name: name }; sentSmtpEmail.subject = {subject:subject}; sendSmtpEmail.sender = {sender:sender}; sendSmtpEmail.to = {to:to}; apiInstance.sendTransacEmail(sendSmtpEmail) .then(function (data) { console.log('Email sent successfully.'); res.send('Email sent successfully.'); }) .catch(function (error) { console.error('Error sending email:', error); res.status(500).send('Error sending email.'); }); });
参考的官方示例代码
const brevo = require('@getbrevo/brevo'); var defaultClient = brevo.ApiClient.instance; let apiKey = defaultClient.authentications['api-key']; apiKey.apiKey = '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'; let apiInstance = new Brevo. TransactionalEmailsApi(); let sendSmtpEmail = new Brevo. SendSmtpEmail(); sendSmtpEmail.subject = "My {{params.subject}}"; sendSmtpEmail.htmlContent = "<html><body><h1>Common: This is my first transactional email {{params.parameter}}</h1></body></html>"; sendSmtpEmail.sender = { "name": "John", "email": "example@example.com" }; sendSmtpEmail.to = [ { "email": "example@brevo.com", "name": "sample-name" } ]; sendSmtpEmail.replyTo = { "email": "example@brevo.com", "name": "sample-name" }; sendSmtpEmail.headers = { "Some-Custom-Name": "unique-id-1234" }; sendSmtpEmail.params = { "parameter": "My param value", "subject": "common subject" }; apiInstance.sendTransacEmail(sendSmtpEmail).then(function (data) { console.log('API called successfully. Returned data: ' + JSON.stringify(data)); }, function (error) { console.error(error); });
第一次报错信息
TypeError: brevo.ApiClient is not a constructor at E:\Projects\email-app1\server.js:25:25 at Layer.handle [as handle_request] (E:\Projects\email-app1\node_modules\express\lib\router\layer.js:95:5) at next (E:\Projects\email-app1\node_modules\express\lib\router\route.js:144:13) at Route.dispatch (E:\Projects\email-app1\node_modules\express\lib\router\route.js:114:3) at Layer.handle [as handle_request] (E:\Projects\email-app1\node_modules\express\lib\router\layer.js:95:5) at E:\Projects\email-app1\node_modules\express\lib\router\index.js:284:15 at Function.process_params (E:\Projects\email-app1\node_modules\express\lib\router\index.js:346:12) at next (E:\Projects\email-app1\node_modules\express\lib\router\index.js:280:10) at E:\Projects\email-app1\node_modules\body-parser\lib\read.js:137:5 at AsyncResource.runInAsyncScope (node:async_hooks:206:9)
修改后的报错信息
TypeError: Cannot read properties of undefined (reading 'instance') at E:\Projects\email-app1\server.js:25:41 at Layer.handle [as handle_request] (E:\Projects\email-app1\node_modules\express\lib\router\layer.js:95:5) at next (E:\Projects\email-app1\node_modules\express\lib\router\route.js:144:13) at Route.dispatch (E:\Projects\email-app1\node_modules\express\lib\router\route.js:114:3) at Layer.handle [as handle_request] (E:\Projects\email-app1\node_modules\express\lib\router\layer.js:95:5) at E:\Projects\email-app1\node_modules\express\lib\router\index.js:284:15 at Function.process_params (E:\Projects\email-app1\node_modules\express\lib\router\index.js:346:12) at next (E:\Projects\email-app1\node_modules\express\lib\router\index.js:280:10) at E:\Projects\email-app1\node_modules\body-parser\lib\read.js:137:5 at AsyncResource.runInAsyncScope (node:async_hooks:206:9)
问题原因与修复方案
核心问题
错误源于Brevo SDK版本不兼容,官方示例可能对应旧版SDK,而你安装的是v2.x及以上新版本,两者初始化API客户端的方式完全不同。
具体修复步骤
确认SDK版本
执行以下命令查看当前安装的SDK版本:npm list @getbrevo/brevo如果版本是v2.x+,按以下方式修改代码。
适配新版本SDK的初始化逻辑
新版本SDK不再需要ApiClient,直接初始化API实例并设置密钥即可:const brevo = require('@getbrevo/brevo'); const apiInstance = new brevo.TransactionalEmailsApi(); // 设置API密钥 apiInstance.setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, '你的API_KEY');修正代码中的其他错误
- 拼写错误:
sentSmtpEmail.subject改为sendSmtpEmail.subject subject直接传字符串,不需要包成对象sendSmtpEmail.to保留数组格式,不要重复赋值为对象
- 拼写错误:
完整修复后的业务代码
app.post('/submit', (req, res) => { const { name, email, subject, sender, to } = req.body; const brevo = require('@getbrevo/brevo'); const apiInstance = new brevo.TransactionalEmailsApi(); apiInstance.setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, '你的API_KEY'); const sendSmtpEmail = new brevo.SendSmtpEmail(); sendSmtpEmail.to = [{ email: email, name: name }]; sendSmtpEmail.templateId = 59; sendSmtpEmail.params = { name: name }; sendSmtpEmail.subject = subject; // 确保sender是{name: '发送者名称', email: '发送者邮箱'}格式 sendSmtpEmail.sender = sender; apiInstance.sendTransacEmail(sendSmtpEmail) .then(() => { console.log('邮件发送成功'); res.send('邮件发送成功'); }) .catch(error => { console.error('邮件发送失败:', error); res.status(500).send('邮件发送失败'); }); });
额外注意事项
- 如果使用v1.x旧版SDK,才需要
brevo.ApiClient.instance的方式,建议升级到v2+ - 确保
sender参数格式正确,必须包含name和email字段 - 模板ID需与Brevo后台创建的模板ID一致
内容的提问来源于stack exchange,提问作者RoooooKie
相关产品推荐
相关产品推荐

