API密钥不以“SG。”开头。SendGrid

20

我正在尝试在我的Heroku NodeJS应用程序中设置SendGrid插件。

我创建了API密钥并将其设置为环境变量。

整个API密钥看起来像这样:SG.actualValue.bbb_cccccc

我最初设置整个密钥作为我的SENDGRID_API_KEY,然后出现了以下错误:

API密钥不以SG开头。

因此,我意识到错误并取消设置环境变量,只重新设置了整个密钥的actualValue部分。

但是,我仍然收到相同的错误。我尝试再次执行相同操作或重新启动终端(实际上是整个笔记本电脑)。

这是我正尝试从SendGrid设置页面运行的测试代码:

const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY)
const msg = {
  to: 'test@example.com',
  from: 'test@example.com',
  subject: 'Sending with Twilio SendGrid is Fun',
  text: 'and easy to do anywhere, even with Node.js',
  html: '<strong>and easy to do anywhere, even with Node.js</strong>',
};
sgMail.send(msg);

我尝试创建一个新的键并将其设置,但是我得到了同样的错误。我尝试将其设置为整个键,但没有".SG"或仅bbb_ccccc部分。 预先感谢您。


我在使用NextJS和vercel进行生产时遇到了相同的错误,但在本地开发环境中,它可以正常工作。有人知道可能是什么问题吗? - Shadab
9个回答

18
API密钥不以SG开头,这意味着SendGrid的API密钥应该SG.开头。所以你没有正确设置环境变量。你需要检查一下。只需使用console.log打印环境变量。或者,使用
$ heroku run bash -a mighty-river-12802

启动应用程序的控制台,并使用printenv打印环境变量。
Running bash on ⬢ mighty-river-12802... up, run.1571 (Free)
~ $ printenv
TERM=xterm-256color
WEB_MEMORY=512
MEMORY_AVAILABLE=512
COLUMNS=367
DYNO=run.1571
PATH=/app/.heroku/node/bin:/app/.heroku/yarn/bin:/usr/local/bin:/usr/bin:/bin:/app/bin:/app/node_modules/.bin
WEB_CONCURRENCY=1
_=/usr/bin/printenv
PWD=/app
PS1=\[\033[01;34m\]\w\[\033[00m\] \[\033[01;32m\]$ \[\033[00m\]
NODE_ENV=production
LINES=49
TIMES=5
HOME=/app
SHLVL=2
PORT=6791
NODE_HOME=/app/.heroku/node

TIMES: 5 环境变量通过 Heroku 配置变量进行设置:

enter image description here

例如

const sgMail = require('@sendgrid/mail');

sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const msg = {
  to: 'novaline.dulin@gmail.com',
  from: 'test@example.com',
  subject: 'Sending with Twilio SendGrid is Fun',
  text: 'and easy to do anywhere, even with Node.js',
  html: '<strong>and easy to do anywhere, even with Node.js</strong>',
};
sgMail
  .send(msg)
  .then(() => console.log('send mail success'))
  .catch(console.log);

$ export SENDGRID_API_KEY=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
$ node index.js
send mail success

按预期收到了邮件。

enter image description here


10

你好,如果你正在使用Node.js,请确保在需要使用sendgrid/nodemailer模块的文件中包含require('dotenv').config()。如果没有这个设置,sendgrid transporter将会是未定义的值而不是api_key。 我之前也遇到了同样的问题,但现在已经解决了。


这对我有用。有时候简单的东西就是最有效的。 - monsto
dotenv.config(); must be called before sgMail.setApiKey(process.env.SENDGRID_API_KEY); - Johar Zaman

5

我正在使用 Node.js 上的 SendGrid v3 和 dotenv v8.2。

SendGrid 设置了一个名为 SendGrid.env 的 env 文件,里面有 SENDGRID_API_KEY 的导出变量,我将文件重命名为 .env,并删除了导出,现在它可以工作了。

我的 sendEmail 文件顶部看起来是这样的:

require('dotenv').config();
const sgMail = require('@sendgrid/mail');
const apiKey = `${process.env.SENDGRID_API_KEY}`;
console.log("SendGrid key ", apiKey);

我的 .env 文件内容如下:

SENDGRID_API_KEY='SG.{left blank}................0EmA'
ANOTHER_API_KEY='ANOTEHERKEY'

谢谢!它对我有用,我没有使用dotenv。 - trsp

2

我在.env文件中把单引号改成了双引号,这解决了我的bug。下面是我的sendgrid.env文件:

SENDGRID_API_KEY = "SG.oDXKOMdlT3-nCEQt........"

1
我曾经遇到过同样的问题,我从.env文件中删除了export关键字,这个方法对我起了作用。

1

在您的测试文件开头,需要执行require('dotenv').config();,否则它将无法找到您的密钥。


生产环境的环境变量应该在服务器上设置,因此不需要使用dotenv。dotenv仅用于开发,而非生产。 - Ufenei augustine

0

我在NestJS中遇到了同样的问题,而且问题是因为我对NestJS非常新手,哈哈。

SendGrid.setApiKey(this.configService.get<string>('SENDGRID_API_KEY'));

configureService 使用变量名称获取值,我认为应该传递变量而不是名称。


0

我在开发环境中运行代码时遇到了这个问题。我还使用了 env-cmd 包。我通过更改 package.json 文件中的内容来解决了这个问题:

"dev": "env-cmd -f ./config/dev.env nodemon src/index.js"

转换为:

"dev": "env-cmd -f ./config/dev.env nodemon src/emails/account.js"

-1

如果您在环境变量(dev.env)上设置了某些内容,但每次没有重新启动服务器,则可能会出现此问题。
例如,如果您将来自sendgrid或任何值的密钥放入环境变量(dev.env)中,则应重新启动服务器。在我的情况下,我也遇到了同样的问题,然后我在console.log中放置了process.env.SENDGRID_API_KEY,并在终端中发现未定义,所以我接下来做的是在终端中键入^c并按回车键:

npm run dev

现在在终端中,您可以看到密钥显示在终端中, 希望这能解决您的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接