如何从 netlify 无服务器函数获取 POST 数据?

问题描述 投票:0回答:2

这是我的服务器的代码,运行良好。我正在尝试使用 netlify 的无服务器功能来实现这一点,我已将其粘贴在下面。

标准服务器-HEROKU 上的代码

const ratingController = {};
const Rating = require("../models/ratingModel");

ratingController.getAllRatings = async function (req, res) {
  const rating = await Rating.find();

  res.status(200).json({
    status: "success",
    data: rating,
  });
};

ratingController.createOneRating = async function (req, res) {
  console.log(req.body);
  req.body.userIp = req.headers["x-forwarded-for"];


  const rating = await Rating.create(req.body);

  // const rating = new Rating(req.body);
  // await rating.save();

  res.status(200).json({
    status: "success",
    data: {
      rating,
    },
  });
};

第 1 部分 - 获取请求

这是我的 getAllRatings 代码,它工作正常

无服务器功能 - NETLIFY

const { MongoClient } = require("mongodb");
require("dotenv").config();

exports.handler = async function getData(event, context) {
  const client = await MongoClient.connect(process.env.DB, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
  });
  const db = client.db();
  try {
    const slug = event.queryStringParameters.id;
    const data = await db.collection("collectionName").find({ slug }).toArray();
    client.close();

    return {
      statusCode: 200,
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        status: "success",
        data: data,
      }),
    };
  } catch (error) {
    console.log(error);

    return {
      statusCode: 400,
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        status: "fail",
        message: error.message,
      }),
    };
  }
};

我对上述问题的第一个问题是

仅仅因为它有效可能并不意味着它是正确的方法。如果每次调用时调用数据库是正确的,然后按照我的方式放置代码(如果它应该是这样的话),我有一些担忧是。这一切都基于测试和随机研究。没有真正的方法可遵循,因此希望获得一些有关更有效方法的指导。

通常在常规服务器上,数据库连接只完成一次..在这里我似乎每次都这样做,我有点困惑这是否可以..


第 2 部分 - 发布请求

这是我的 POST 请求 createOneRating 的代码

无服务器功能 - NETLIFY

const { MongoClient } = require("mongodb");
require("dotenv").config();

exports.handler = async function createRating(event, context) {
  const client = await MongoClient.connect(process.env.DB, {
    useUnifiedTopology: true,
    useNewUrlParser: true,
  });
  const db = client.db();
  try {
    console.log(event);
    const rating = await db.collection("ratings").insertOne(event.body);

    client.close();

    return {
      statusCode: 200,
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        status: "success",
        data: rating,
      }),
    };
  } catch (error) {
    console.log(error);

    return {
      statusCode: 400,
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        status: "fail",
        message: error.message,
      }),
    };
  }
};

这个并不像它说的那样工作

{
    "status": "fail",
    "message": "Cannot create property '_id' on string ''"
}

我猜这是因为 event.body 不是数据所在的位置..但我不确定如何在无服务器部署中获取 POST 数据。

所以我的第二个问题是

如何检索 POST 请求发送的数据。由于没有

request
参数,我有点困惑。

另外,我想添加用户的 IP,因此除了 POST 数据之外,我还需要一些有关如何执行此操作的帮助

  req.body.userIp = req.headers["x-forwarded-for"];

javascript node.js mongodb serverless netlify
2个回答
1
投票

根据我自己的研究,我对这些问题有了答案,并将其放在这里,供我自己参考,也供将来可能面临类似情况的人参考。

问题 1:是否可以在每次调用无服务器函数时建立数据库连接

这样做似乎没问题,对于像我这样认为这可能不是正确方法的人来说,这绝对不是错误的方法。也许有一种有效的方法可以做到这一点,如果可能的话,我愿意了解更多相关信息。但现在,知道每次调用都连接数据库并没有错,这很好。

问题2:如何在无服务器上发起POST请求,因为没有请求参数

我不知道

event
参数实际上是
request
参数的替代品,并且标头和正文是事件对象的属性,可以以相同的方式访问,即
event.body
event.headers
。这里有一个链接,可以节省您一些时间来确认这一点。

https://docs.netlify.com/functions/build-with-javascript/#synchronous-function-format

如果您和我一样,不知道无服务器函数是否可以定义为

GET
POST
,或者在进行函数调用时遇到
POST
请求转换为
GET
的问题这是一个有帮助的链接。

如何将Netlify函数端点定义为POST?


0
投票

使用express-js 和 serverless-http npm 包会更好更容易,你就完成了。 你不会遇到这样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.