You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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客户端的方式完全不同。

具体修复步骤

  1. 确认SDK版本
    执行以下命令查看当前安装的SDK版本:

    npm list @getbrevo/brevo
    

    如果版本是v2.x+,按以下方式修改代码。

  2. 适配新版本SDK的初始化逻辑
    新版本SDK不再需要ApiClient,直接初始化API实例并设置密钥即可:

    const brevo = require('@getbrevo/brevo');
    const apiInstance = new brevo.TransactionalEmailsApi();
    // 设置API密钥
    apiInstance.setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, '你的API_KEY');
    
  3. 修正代码中的其他错误

    • 拼写错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:39:57