我如何从netlify无服务器功能获得POST数据?



这是我的服务器工作良好的代码。我正试图用netflix的无服务器功能来实现这一点,我已经在下面进一步粘贴了。

标准服务器- 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,
},
});
};

PART 1 - GET REQUEST

这是我的getAllRatings代码,它工作得很好

SERVERLESS FUNCTION - 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,
}),
};
}
};

我的第一个问题是

仅仅因为它工作可能并不意味着它是正确的方法。我有一些担心,如果调用数据库每次有一个调用是正确的,然后把代码的方式我有,如果它应该是这样的。这都是基于测试和随机研究。没有真正的方法被遵循,所以希望能有一些指导更有效的方法来做到这一点。

在普通服务器上,数据库连接通常只完成一次。而这里我似乎每次都这样做,我有点困惑,如果这是可以的或不…


PART 2 - POST REQUEST

这是我的代码为POST请求createonating

SERVERLESS FUNCTION - 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 ''"
}

我想那是因为事件。身体不是数据所在的地方…但是我不确定如何在无服务器部署中获得POST数据。

第二个问题是

如何检索POST请求发送的数据。由于没有request参数,我有点困惑。

我还想添加用户的IP,所以除了POST数据之外,我还需要一些关于如何做到这一点的帮助

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

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

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

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

问题2:当没有请求参数时,如何在无服务器上发出POST请求

我不知道event参数实际上是request参数的替代品,标题和正文是事件对象的属性,可以以相同的方式访问event.bodyevent.headers。这里有一个链接,可以节省你确认这一点的时间。

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

如果你像我一样,不知道无服务器函数是否可以定义为GETPOST,或者在进行函数调用时遇到POST请求转换为GET的问题,这里有一个链接可以帮助。

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

最新更新