Sailsjs MVC 将参数从外部 API 映射到多个模型
Sailsjs MVC map params from external API to multiple models
我需要创建一个 shopify 订单数据库,这样我就可以 运行 高级查询和销售报告,而这在 shopify 管理区域是做不到的。我在 Sails .12 和 mysql 中构建。 Shopify 允许您注册一个 webhook,这样每次下订单时,它都会为指定的 URL 创建一个 POST,正文中的订单数据为 JSON。订购的产品是 JSON 个对象的数组,作为 POST:
中的值之一
{
"id": 123456,
"email": "jon@doe.ca",
"created_at": "2017-01-10T14:26:25-05:00",
...//many more entires
"line_items": [
{
"id": 24361829895,
"variant_id": 12345,
"title": "T-Shirt",
"quantity": 1,
"price": "140.00",
},
{
"id": 44361829895,
"variant_id": 42345,
"title": "Hat",
"quantity": 1,
"price": "40.00",
},
]
}
我需要将订单保存到订单 table 中,并将订购的产品保存到一对多关系的 line_items table 中;一个订单可以有多个 line_items(订购的产品)。 Webhook 发送了 100 多个键值对,我正在保存所有这些。我已经在定义数据类型的地方创建了两个模型,所以现在我有很长的 Order.js 和 Line_item.js 文件,并且我正在使用
line_items: {
collection: 'line_item',
via: 'order_id'
},
在我的 Order.js 和
order_id: {
model: 'order'
},
在我的 Line_item.js 模型中关联它们。这是定义我的两个 table 的正确方法吗?另外,我会将 JSON 映射到模型参数的代码放在哪里?如果我将该代码放入控制器中,我是否必须输入另外 100 多行代码才能将每个 json 值映射到其正确的参数。我将如何保存到两个不同的models/tables?例如:
var newOrder = {};
newOrder.id =req.param('id');
newOrder.email = req.param('email');
newOrder.name = req.param('name');
...//over 100 lines more, then Order.create(newOrder, ...)
var newLine_items = req.params('line_items'); //an array
_.forEach(newLine_items, function(line_item){
var newLine_item = {};
newLine_item.id = line_item.id;
newLine_item.order_id = newOrder.id;
newLine_item.title = line_item.title;
//etc for over 20 more lines, then Line_item.create(newLine_item, ...)
});
I need to save the order into an Orders table, and the products ordered into a line_items table that is a one to many relation; one order can have many line_items (products ordered).
这听起来完全有道理,嗯,除了使用牛津逗号:)
There are over 100 key-value pairs sent by the webhook
我不确定我是否完全理解这是什么或它在此过程中的用途。
也就是说,在您的模型中为此设置一个具有 JSON 值的属性可能会有所帮助,然后检索并使用它作为 JSON 而不是尝试手动计算对于每个属性,如果那是你在那里做的?
这实际上取决于您的用例以及您将如何使用数据,但我认为如果格式发生变化,您可能会遇到问题,如果只是将其存储和解析为 JSON对象?
Also, where would I put the code that maps the JSON to the model parameters
在 v0.12.x 看看 Services.
在 v1 中,服务仍然有效,但将此逻辑移至 Helpers might be a good option but then, it seems that a custom model method 会更好。
这是您的代码的较短版本:
var newOrder = req.allParams();
newLine_items = {};
_.forEach(newOrder.line_items, function(line_item) {
newLine_items.push(line_item);
});
您的逻辑可能如下所示:
var newOrder = req.allParams();
// Store the order
Order
.create(newOrders)
.exec(function (err, result) {
if (err) // handle the error
var newLine_items = {};
_.forEach(newOrder.line_items, function(line_item) {
// Add the order id for association
line_item.order_id = result.id;
// Add the new line item with the orders id
newLine_items.push(line_item);
});
// Store the orders line items
LineItems
.create(newLine_items)
.exec(function (err, result) {
if (err) // handle the error
// Handle success
});
});
订单模型中的生命周期回调:
beforeCreate: function (values, cb) {
delete(values.line_items);
cb();
}
但是你真的应该研究一下 bluebird promises,因为第一版 sails 中的模型方法已经选择支持它们,它有助于否定在我的例子中开始的厄运金字塔,这也是你想要的避免 :P
我需要创建一个 shopify 订单数据库,这样我就可以 运行 高级查询和销售报告,而这在 shopify 管理区域是做不到的。我在 Sails .12 和 mysql 中构建。 Shopify 允许您注册一个 webhook,这样每次下订单时,它都会为指定的 URL 创建一个 POST,正文中的订单数据为 JSON。订购的产品是 JSON 个对象的数组,作为 POST:
中的值之一{
"id": 123456,
"email": "jon@doe.ca",
"created_at": "2017-01-10T14:26:25-05:00",
...//many more entires
"line_items": [
{
"id": 24361829895,
"variant_id": 12345,
"title": "T-Shirt",
"quantity": 1,
"price": "140.00",
},
{
"id": 44361829895,
"variant_id": 42345,
"title": "Hat",
"quantity": 1,
"price": "40.00",
},
]
}
我需要将订单保存到订单 table 中,并将订购的产品保存到一对多关系的 line_items table 中;一个订单可以有多个 line_items(订购的产品)。 Webhook 发送了 100 多个键值对,我正在保存所有这些。我已经在定义数据类型的地方创建了两个模型,所以现在我有很长的 Order.js 和 Line_item.js 文件,并且我正在使用
line_items: {
collection: 'line_item',
via: 'order_id'
},
在我的 Order.js 和
order_id: {
model: 'order'
},
在我的 Line_item.js 模型中关联它们。这是定义我的两个 table 的正确方法吗?另外,我会将 JSON 映射到模型参数的代码放在哪里?如果我将该代码放入控制器中,我是否必须输入另外 100 多行代码才能将每个 json 值映射到其正确的参数。我将如何保存到两个不同的models/tables?例如:
var newOrder = {};
newOrder.id =req.param('id');
newOrder.email = req.param('email');
newOrder.name = req.param('name');
...//over 100 lines more, then Order.create(newOrder, ...)
var newLine_items = req.params('line_items'); //an array
_.forEach(newLine_items, function(line_item){
var newLine_item = {};
newLine_item.id = line_item.id;
newLine_item.order_id = newOrder.id;
newLine_item.title = line_item.title;
//etc for over 20 more lines, then Line_item.create(newLine_item, ...)
});
I need to save the order into an Orders table, and the products ordered into a line_items table that is a one to many relation; one order can have many line_items (products ordered).
这听起来完全有道理,嗯,除了使用牛津逗号:)
There are over 100 key-value pairs sent by the webhook
我不确定我是否完全理解这是什么或它在此过程中的用途。
也就是说,在您的模型中为此设置一个具有 JSON 值的属性可能会有所帮助,然后检索并使用它作为 JSON 而不是尝试手动计算对于每个属性,如果那是你在那里做的?
这实际上取决于您的用例以及您将如何使用数据,但我认为如果格式发生变化,您可能会遇到问题,如果只是将其存储和解析为 JSON对象?
Also, where would I put the code that maps the JSON to the model parameters
在 v0.12.x 看看 Services.
在 v1 中,服务仍然有效,但将此逻辑移至 Helpers might be a good option but then, it seems that a custom model method 会更好。
这是您的代码的较短版本:
var newOrder = req.allParams();
newLine_items = {};
_.forEach(newOrder.line_items, function(line_item) {
newLine_items.push(line_item);
});
您的逻辑可能如下所示:
var newOrder = req.allParams();
// Store the order
Order
.create(newOrders)
.exec(function (err, result) {
if (err) // handle the error
var newLine_items = {};
_.forEach(newOrder.line_items, function(line_item) {
// Add the order id for association
line_item.order_id = result.id;
// Add the new line item with the orders id
newLine_items.push(line_item);
});
// Store the orders line items
LineItems
.create(newLine_items)
.exec(function (err, result) {
if (err) // handle the error
// Handle success
});
});
订单模型中的生命周期回调:
beforeCreate: function (values, cb) {
delete(values.line_items);
cb();
}
但是你真的应该研究一下 bluebird promises,因为第一版 sails 中的模型方法已经选择支持它们,它有助于否定在我的例子中开始的厄运金字塔,这也是你想要的避免 :P