В хапи, как я могу получить доступ к полезной нагрузке запроса для методов GET - PullRequest
0 голосов
/ 23 января 2019

Я использую Nodejs с Hapi для реализации остальных API, а внутренняя БД - это mongo.У меня есть требование, когда пользователь может передавать параметры в полезной нагрузке запроса для вызова GET, и мне нужно искать соответственно на основе этих значений.В Hapi Framework я не получаю никакого значения полезной нагрузки, когда я делаю метод GET.Есть ли способ, которым я могу получить полезную нагрузку.Ниже приведен мой код.

route:

{
        method: "GET",
        path: `/v1/getProducts`,
        handler: function(request, reply) {
          ProductController.getProducts(request, reply);
        }
}

ProductController:

   const mongoose = require("mongoose");

const Products = require("../models/products");

const getProducts = (req, res) => {
  console.log("I am in getProducts");
  console.log("Headers :", req.headers);
  console.log(req.payload);
  var query = {};
  //If values present in request payload for a query accordingly
  if (req.payload.productName) {
    query["PRODUCT_NAME"] = req.payload.productName;
  }
  if (req.payload.productType) {
    query["PRODUCT_TYPE"] = req.payload.productType;
  }
  if (req.payload.supportHardware) {
    query["HARD_SUPP"] =
      req.payload.supportHardware;
  }

  Products.find(query, "-_v")
    .exec()
    .then(results => {
      console.log(results);
      res({ result: "Success", ProductList: results });
    })
    .catch(err => {
      console.log("GETPRODUCTS RESPONSE: ", err.stack);
      res({ error: { errorId: "xyz", message: err } });
    });
};

module.exports = { getProducts };

Но в значении req.payload

I am in getProducts
Headers : { host: 'localhost:8000',
  'user-agent': 'curl/7.63.0',
  accept: '*/*',
  'content-type': 'application/json',
  authorization: 'Basic bTE3NTg5h1Yi5hdHQuY29tOmJyaWFuSXNDb29sMTg=',
  'content-length': '34',
  SERVICENAME: 'rest/productService/v1/getProducts',
  REQUEST_START_TIME: 1548272230344,
  'X-CSI-ConversationId': 'anscUser~CNG-CSI~1d58d6fd-a981-4bba-b9ed-16964d7cc51b',
  'X-CSI-UniqueTransactionId': 'AnscCsiRestful38856@e1f99082-150e-4b1e-b92f-04bb6c007d65',
  'X-CSI-MessageId': '1b06946e-732d-4075-ba6a-2dc7d13f4f80',
  'X-CSI-TimeToLive': '60000',
  'X-CSI-SequenceNumber': '1',
  'X-CSI-TotalInSequence': '1',
  'X-CSI-ClientApp': 'ansc-csi-restful~N/A',
  DOWNSTREAM_CALLS_INFO: [] }

  null
указано нулевое значение

1 Ответ

0 голосов
/ 24 января 2019

Мне наконец пришло в голову, что вы передаете полезную нагрузку в запросе GET.Это не то, что вы должны делать.Вы должны передавать полезные данные / значения поиска в качестве параметров запроса.В качестве альтернативы, вы должны рассмотреть возможность использования POST запроса. Здесь - некоторая дополнительная информация по этой теме.

В вашем случае, если вы хотите продолжить использовать запрос GET, вы должны использовать request.query для доступа к значениям. Документы здесь

Что-то похожее на приведенное ниже будет перебирать все переданные параметры запроса и создавать вам запрос lookUp, который будет использоваться при поиске в БД.Возможно, вы захотите добавить фильтр или проверить имена ключей, поскольку вы не хотите, чтобы случайные ключи использовались в качестве полей поиска в вашем запросе базы данных

В приведенном ниже тексте req.query заменяется на query.

var query = {"PRODUCT_NAME": 123, "PRODUCT_TYPE": 456};

var lookupQuery = Object.keys(query).reduce((lookUp, key) => {
  lookUp[key] = query[key]
  return lookUp
}, {})

console.log(lookupQuery);
...