从 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.jsmailingList.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.jsmailingList.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);
      });
  };