NextJS中用node-mailjet添加联系人至邮件列表遇404错误求助
问题
在NextJS项目中使用^6.0.2版本的node-mailjet SDK,采用ES6导入方式尝试向联系人列表添加新联系人以创建新闻通讯。根据MailJet官方文档,新联系人会自动创建,但持续收到404 Object not found错误。使用相同请求数据在Postman中发起请求可得到201 OK响应,求代码问题所在。
代码片段
import mailjet from 'node-mailjet'
const mailjetClient = mailjet.apiConnect( process.env.MJ_APIKEY_PUBLIC, process.env.MJ_APIKEY_PRIVATE);
//其他代码... export async function addContactToContactList(listId, name, email) { try { const result = await mailjetClient.post("contactslist", { 'version': 'v3' }) .id(liatId) .action("managecontact") .request({ "Name": name, "Action": "addnoforce", "Email": email }) console.log(result.body.Data); //调试日志 return result.body.Data; } catch (error) { console.error(error); return false } }
完整错误日志
Error: Unsuccessful: Status Code: "404" Message: "Object not found" at e.<anonymous> (D:\YOSLE\pymemarket\node_modules\node-mailjet\mailjet.node.js:2:37964) at D:\YOSLE\pymemarket\node_modules\node-mailjet\mailjet.node.js:2:33895 at Object.throw (D:\YOSLE\pymemarket\node_modules\node-mailjet\mailjet.node.js:2:34000) at r (D:\YOSLE\pymemarket\node_modules\node-mailjet\mailjet.node.js:2:32765) at processTicksAndRejections (internal/process/task_queues.js:93:5) { code: 'ERR_BAD_REQUEST', config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function (anonymous)], transformRequest: [ [Function (anonymous)] ], transformResponse: [Function: transformResponse], timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: { FormData: [Function] }, validateStatus: [Function: validateStatus], headers: { Accept: 'application/json, text/plain, */*', 'Content-Type': 'application/json', 'User-Agent': 'mailjet-api-v3-nodejs/6.0.2', 'Content-Length': 80 }, url: 'https://api.mailjet.com/v3/REST/contactslist/10249638/managecontact', params: {}, data: '{"Name":"Chuck Parker","Action":"addnoforce","Email":"yosle007+chuck@gmail.com"}', method: 'post', responseType: 'json', auth: { username: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', password: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' } }, response: { status: 404, statusText: 'Object not found', headers: { date: 'Wed, 31 May 2023 21:58:58 GMT', 'content-type': 'application/json', 'content-length': '77', connection: 'close' }, config: { transitional: [Object], adapter: [Function (anonymous)], transformRequest: [Array], transformResponse: [Function: transformResponse], timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: [Object], validateStatus: [Function: validateStatus], headers: [Object], url: 'https://api.mailjet.com/v3/REST/contactslist/10249638/managecontact', params: {}, data: '{"Name":"Chuck Parker","Action":"addnoforce","Email":"yosle007+chuck@gmail.com"}', method: 'post', responseType: 'json', auth: [Object] }, request: ClientRequest { _events: [Object: null prototype], _eventsCount: 7, _maxListeners: undefined, outputData: [], outputSize: 0, writable: true, destroyed: false, _last: true, chunkedEncoding: false, shouldKeepAlive: false, useChunkedEncodingByDefault: true, sendDate: false, _removedConnection: false, _removedContLen: false, _removedTE: false, _contentLength: null, _hasBody: true, _trailer: '', finished: true, _headerSent: true, socket: [TLSSocket], _header: 'POST /v3/REST/contactslist/10249638/managecontact HTTP/1.1\r\n' + 'Accept: application/json, text/plain, */*\r\n' + 'Content-Type: application/json\r\n' + 'User-Agent: mailjet-api-v3-nodejs/6.0.2\r\n' + 'Content-Length: 80\r\n' + 'Host: api.mailjet.com\r\n' + 'Authorization: Basic MTFmMDRiMjgxMjMzMzMwMTc1OGYxMDIwMzc2MGEwMjE6OWQxNWM2MDA5NmJjMjIxYjcxOTM1Y2M2OTU0OGRlNmQ=\r\n' + 'Connection: close\r\n' + '\r\n', _keepAliveTimeout: 0, _onPendingData: [Function: noopPendingOutput], agent: [Agent], socketPath: undefined, method: 'POST', maxHeaderSize: undefined, insecureHTTPParser: undefined, path: '/v3/REST/contactslist/10249638/managecontact', _ended: true, res: [IncomingMessage], aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'api.mailjet.com', protocol: 'https:', _redirectable: [Writable], [Symbol(kCapture)]: false, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype] }, data: [Object: null prototype] { ErrorInfo: '', ErrorMessage: 'Object not found', StatusCode: 404 } }, statusCode: 404, statusText: 'Object not found', originalMessage: 'Object not found', ErrorMessage: 'Object not found' } addedcontact es false
解决方案
代码存在一个明显的拼写错误:.id(liatId)中的变量名liatId写错了,应该是函数参数定义的listId。
这个拼写错误会导致SDK无法正确传入有效的联系人列表ID,即使错误日志中显示的URL包含正确ID,但实际运行时liatId是未定义的变量,会被SDK处理成无效值,最终导致MailJet找不到对应的联系人列表,返回404错误。而Postman请求能成功,是因为你手动传入了正确的列表ID,不存在拼写问题。
修正后的代码:
//其他代码... export async function addContactToContactList(listId, name, email) { try { const result = await mailjetClient.post("contactslist", { 'version': 'v3' }) .id(listId) // 修正拼写错误 .action("managecontact") .request({ "Name": name, "Action": "addnoforce", "Email": email }) console.log(result.body.Data); //调试日志 return result.body.Data; } catch (error) { console.error(error); return false } }
内容的提问来源于stack exchange,提问作者Yosleivys Baez Acosta
相关产品推荐
相关产品推荐

