如何从 netlify 无服务器函数中获取 POST 数据?
How do I get the POST data from a netlify serverless function?
这是我的服务器的代码,运行良好。我正在尝试使用 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 请求
这是我的 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"];
根据我自己的研究,我有问题的答案,并把它们放在这里供我自己参考,也供将来可能遇到类似情况的人参考。
问题 1:是否可以在每次调用无服务器函数时建立数据库连接
这样做似乎没问题,对于那些像我一样认为这样做可能不正确的人来说,这绝对不是错误的方法。也许有一种有效的方法可以做到这一点,如果可能的话,我愿意了解更多相关信息。但现在,知道每次调用都连接数据库并没有错是件好事。
问题 2:由于没有请求参数,如何在无服务器上发出 POST 请求
我不知道 event
参数实际上是 request
参数的替代品,并且 headers 和 body 是事件的属性 object 并且可以用相同的方式访问,即 event.body
和 event.headers
。这里有一个 link 可以节省你一些时间来确认这一点。
(https://docs.netlify.com/functions/build-with-javascript/#synchronous-function-format)
如果您像我一样不知道是否可以将无服务器函数定义为 GET
或 POST
或 运行,那么 POST
请求在进行函数调用时被转换为 GET
这里的 link 会有所帮助。
这是我的服务器的代码,运行良好。我正在尝试使用 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 请求
这是我的 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"];
根据我自己的研究,我有问题的答案,并把它们放在这里供我自己参考,也供将来可能遇到类似情况的人参考。
问题 1:是否可以在每次调用无服务器函数时建立数据库连接
这样做似乎没问题,对于那些像我一样认为这样做可能不正确的人来说,这绝对不是错误的方法。也许有一种有效的方法可以做到这一点,如果可能的话,我愿意了解更多相关信息。但现在,知道每次调用都连接数据库并没有错是件好事。
问题 2:由于没有请求参数,如何在无服务器上发出 POST 请求
我不知道 event
参数实际上是 request
参数的替代品,并且 headers 和 body 是事件的属性 object 并且可以用相同的方式访问,即 event.body
和 event.headers
。这里有一个 link 可以节省你一些时间来确认这一点。
(https://docs.netlify.com/functions/build-with-javascript/#synchronous-function-format)
如果您像我一样不知道是否可以将无服务器函数定义为 GET
或 POST
或 运行,那么 POST
请求在进行函数调用时被转换为 GET
这里的 link 会有所帮助。