OPTIONS вызов рассматривается как «обычный» вызов - PullRequest
0 голосов
/ 31 октября 2019

Когда я начал локальную отладку своей первой облачной функции, я заметил, что при вызове функции из веб-приложения в базу данных добавлялись две записи, а не 1 запись (ожидаемое поведение) при использовании Postman.

Это сразу заставило меня задуматься о OPTIONS вызове, который сейчас является частью большинства HTTP-запросов браузера.

Мне удалось обойти это, добавив

  if (req.method === "POST") {

вокруг теламоя функция, но я был бы удивлен, если бы это действительно было необходимо.

Есть ли какой-нибудь другой и лучший способ?

РЕДАКТИРОВАТЬ с фрагментом кода

module.exports = async (req, res) => {
  res.set("Access-Control-Allow-Origin", "*");
  res.set(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );

  if (req.method === "POST") {
    const uri = MYMONGOURI;
    const client = new MongoClient(uri, { useNewUrlParser: true });

    await client.connect();

    const collection = client.db(MYDB).collection(MYCOLLECTION);
    const { title } = req.body;
    await collection.insertOne({ title });

    client.close();
    res.sendStatus(201);
  }

  res.send("Apparently not post..");
};

1 Ответ

1 голос
/ 31 октября 2019

Когда вы пишете облачную функцию, и она вызывается с веб-страницы из домена, отличного от того, в котором размещена ваша облачная функция, браузер требует одобрения CORS для выполнения запроса. Это полностью задокументировано здесь:

Высокий уровень этого заключается в том, что ваша собственная реализация функции должна быть готова кобработать запрос HTTP OPTIONS и, учитывая входящие параметры, решить, разрешить или отклонить запрос. Запрос OPTIONS отправляет предполетное подтверждение перед основным запросом.

Вы можете использовать облачные конечные точки для подключения вашего браузера к обработке запроса CORS от вашего имени, если вы не хотите включать код вваша облачная функция.

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...