我将带有Hapi的Nodejs与其他API结合使用,后端数据库为mongo。我有一个要求,用户可以在GET调用的请求有效负载中传递参数,我需要根据这些值进行相应搜索。在Hapi框架中,执行GET方法时不会获得任何有效负载值。有没有办法我可以获取有效载荷。下面是我的代码。
路线:
{
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
答案 0 :(得分:0)
我终于想到您正在GET
请求中传递有效负载。这不是您应该做的事情。您应该将有效负载数据/查找值作为查询参数进行传递。另外,您应该考虑改为使用POST
请求。 Here是有关此主题的一些其他信息。
对于您的情况,如果要继续使用GET
请求,则应使用request.query
访问值。 Docs here
类似下面的内容将循环遍历所有传入的查询参数,并为您建立一个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);