从 Netlify 函数中调用 Nextjs API
Call Nextjs API from within Netlify function
我得到了这样的无服务器 Netlify 函数:
exports.handler = async function(event, context) {
return {
statusCode: 200,
body: JSON.stringify({message: "Hello World"})
};
}
被这个调用时 url <site-name>/.netlify/functions/helloworld
我确实收到消息 {"message":"Hello World"}
我还有一个 pages/api/mailingList.js
Nextjs API 端点:
const axios = require('axios');
export default async function handler(req, res) {
//console.log(req.query.mail);
if (req.method === "PUT") {
axios
.put(
"https://api.sendgrid.com/v3/marketing/contacts",
{
contacts: [{ email: `${req.query.mail}` }],
list_ids: [process.env.SENDGRID_MAILING_LIST_ID],
},
{
headers: {
"content-type": "application/json",
Authorization: `Bearer ${process.env.SENDGRID_API_KEY}`,
},
}
)
.then((result) => {
res.status(200).send({
message:
"Your email has been successfully added to the mailing list. Welcome ",
});
})
.catch((err) => {
res.status(500).send({
message:
"Oups, there was a problem with your subscription, please try again or contact us",
});
console.error(err);
});
}
}
这个邮件列表 API 端点,在使用 PUT 作为方法的终端使用 curl 时工作:
curl -X PUT -d mail=helloworld@gmail.com https://netlify.app/api/mailingList
当从 mailingList.js
中删除 if (req.method === "PUT") {
部分时,API 端点也适用于 URL (/api/mailingList?mail=helloworld@gmail.com
)
但是,我无法从 Netlify 函数中获取要调用的 API 端点。
(最好 mailingList
API 应该可以根据不同的逻辑 /api/mailingList?mail=helloworld@gmail.com&listid=xxx
使用来自 Netlify 函数 helloworld.js
的不同邮件列表 ID 多次调用)
为了完全调用 API 端点,从函数中,我尝试添加一个从 helloworld.js
到 mailingList.js
的 axios 调用,就像这样
const axios = require('axios');
exports.handler = async function(event, context) {
const mail = "helloworld@gmail.com";
// add to mailinglist
axios
.put("/api/mailingList?mail="+mail)
.then((result) => {
if (result.status === 200) {
toast.success(result.data.message);
}
})
.catch((err) => {
console.log(err);
});
}
这导致浏览器出现以下错误:error decoding lambda response: invalid status code returned from lambda: 0
(我没有从 Netlify 日志中收到任何错误消息,helloworld.js
或 mailingList.js
)
显然,我从 helloworld.js
调用 mailigList.js
的方式有问题。如果有人能给我一些建议并告诉我我做错了什么,将不胜感激。
如何从 Netlify 函数 helloworld.js
中调用 API 端点 (mailigList.js
)?(最好多次使用不同的邮件列表 ID:/api/mailingList?mail=helloworld@gmail.com&listid=xxx
)
在这篇文章中找到了解决方案:https://travishorn.com/netlify-lambda-functions-from-scratch-1186f61c659e
const axios = require('axios');
const mail = "helloworld@gmail.com";
exports.handler = (event, context, callback) => {
axios.put("https://<domain>.netlify.app/api/mailingList?mail="+mail)
.then((res) => {
callback(null, {
statusCode: 200,
body: res.data.title,
});
})
.catch((err) => {
callback(err);
});
};
我得到了这样的无服务器 Netlify 函数:
exports.handler = async function(event, context) {
return {
statusCode: 200,
body: JSON.stringify({message: "Hello World"})
};
}
被这个调用时 url <site-name>/.netlify/functions/helloworld
我确实收到消息 {"message":"Hello World"}
我还有一个 pages/api/mailingList.js
Nextjs API 端点:
const axios = require('axios');
export default async function handler(req, res) {
//console.log(req.query.mail);
if (req.method === "PUT") {
axios
.put(
"https://api.sendgrid.com/v3/marketing/contacts",
{
contacts: [{ email: `${req.query.mail}` }],
list_ids: [process.env.SENDGRID_MAILING_LIST_ID],
},
{
headers: {
"content-type": "application/json",
Authorization: `Bearer ${process.env.SENDGRID_API_KEY}`,
},
}
)
.then((result) => {
res.status(200).send({
message:
"Your email has been successfully added to the mailing list. Welcome ",
});
})
.catch((err) => {
res.status(500).send({
message:
"Oups, there was a problem with your subscription, please try again or contact us",
});
console.error(err);
});
}
}
这个邮件列表 API 端点,在使用 PUT 作为方法的终端使用 curl 时工作:
curl -X PUT -d mail=helloworld@gmail.com https://netlify.app/api/mailingList
当从 mailingList.js
if (req.method === "PUT") {
部分时,API 端点也适用于 URL (/api/mailingList?mail=helloworld@gmail.com
)
但是,我无法从 Netlify 函数中获取要调用的 API 端点。
(最好 mailingList
API 应该可以根据不同的逻辑 /api/mailingList?mail=helloworld@gmail.com&listid=xxx
使用来自 Netlify 函数 helloworld.js
的不同邮件列表 ID 多次调用)
为了完全调用 API 端点,从函数中,我尝试添加一个从 helloworld.js
到 mailingList.js
的 axios 调用,就像这样
const axios = require('axios');
exports.handler = async function(event, context) {
const mail = "helloworld@gmail.com";
// add to mailinglist
axios
.put("/api/mailingList?mail="+mail)
.then((result) => {
if (result.status === 200) {
toast.success(result.data.message);
}
})
.catch((err) => {
console.log(err);
});
}
这导致浏览器出现以下错误:error decoding lambda response: invalid status code returned from lambda: 0
(我没有从 Netlify 日志中收到任何错误消息,helloworld.js
或 mailingList.js
)
显然,我从 helloworld.js
调用 mailigList.js
的方式有问题。如果有人能给我一些建议并告诉我我做错了什么,将不胜感激。
如何从 Netlify 函数 helloworld.js
中调用 API 端点 (mailigList.js
)?(最好多次使用不同的邮件列表 ID:/api/mailingList?mail=helloworld@gmail.com&listid=xxx
)
在这篇文章中找到了解决方案:https://travishorn.com/netlify-lambda-functions-from-scratch-1186f61c659e
const axios = require('axios');
const mail = "helloworld@gmail.com";
exports.handler = (event, context, callback) => {
axios.put("https://<domain>.netlify.app/api/mailingList?mail="+mail)
.then((res) => {
callback(null, {
statusCode: 200,
body: res.data.title,
});
})
.catch((err) => {
callback(err);
});
};