抓住webhook node.js

我正在尝试捕获由Node.js中的Aftership API所做的PUT / webhook请求。 每次需要做推送通知时都会发出一个PUT请求,我正在使用Parse发送通知,但是我需要一些来自webhook的数据。

webhook的标题看起来像Content-Type: application/json并包含这些数据:

ts – 事件发生的UTC unix时间戳

事件 – 事件的名称(用于跟踪更新,值将为'tracking_update')

msg – 有关事件发生的消息的详细信息,格式如下。

我将如何去得到跟踪号码,slug和token值在节点或js中的自定义字段字典?

 { "event": "tracking_update", "msg": { "id": "53aa94fc55ece21582000004", "tracking_number": "906587618687", "title": "906587618687", "origin_country_iso3": null, "destination_country_iso3": null, "shipment_package_count": 0, "active": false, "order_id": null, "order_id_path": null, "customer_name": null, "source": "web", "emails": [], "custom_fields": {}, "tag": "Delivered", "tracked_count": 1, "expected_delivery": null, "signed_by": "D Johnson", "shipment_type": null, "tracking_account_number": null, "tracking_postal_code": "DA15BU", "tracking_ship_date": null, "created_at": "2014-06-25T09:23:08+00:00", "updated_at": "2014-06-25T09:23:08+00:00", "slug": "dx", "unique_token": "xk7LesjIgg", "checkpoints": [{ "country_name": null, "country_iso3": null, "state": null, "city": null, "zip": null, "message": "Signed For by: D Johnson", "coordinates": [], "tag": "Delivered", "created_at": "2014-06-25T09:23:11+00:00", "checkpoint_time": "2014-05-02T16:24:38", "slug": "dx" }] }, "ts": 1403688191 } 

它可以用Express框架完成,例如:

 var express = require('express'), bodyParser = require('body-parser'), app = express(), port = 3000; app.use(bodyParser.json()); app.post('/', function (req, res) { var body = req.body; var trackingNumber = body.msg.tracking_number; var slug = body.msg.slug; var token = body.msg.unique_token; console.log(trackingNumber, slug, token); res.json({ message: 'ok got it!' }); }); var server = app.listen(port, function () { var host = server.address().address var port = server.address().port console.log('Example app listening at http://%s:%s', host, port) }); 

这里是GIT仓库 ,只需克隆它,然后执行npm install然后npm start 。 服务器将在端口3000上运行:D

注意:我在Aftership Webhook的文档中看到,它说他们会请求POST HTTP方法,而不是PUT所以我创build了一个post请求的例子。 只要把它replace,如果你想要赶上要求。

为了检查webhooks数据,我build议将每个请求存储在数据库中,然后查询数据库。 由于每个请求都不相同,所以最简单的方法是在sails.js中创buildAPI(Node.js框架易于使用ORM)。

 sudo npm install sails -g sails new _project_name_ cd _project_name_ sails generate api Records 

使用上一个命令,sails已经生成控制器和模型来存储您的webhook数据。

我build议安装pm2运行应用程序。 你可以运行它

 pm2 start app.js 

接下来,你应该configuration你的webhook Aftership以下url:

YOUR_SERVER_IP:PORT /logging/创build

您可以通过以下url检查数据:

YOUR_SERVER_IP:PORT /logging/发现

如果你想parsing数据,可以在RecordsController.js中完成,例如:

 Parsing: function(req, res) { Records.find({}).exec(function(err, results) { var output = []; while (results.length) { var result = results.pop(); //custom parsing goes here //example: output.push({ tracking_number: result.msg.tracking_number, slug: result.msg.slug, unique_token: result.msg.unique_token }); } return res.json(output); }); }, 

您可以通过以下URL调用此方法:YOUR_SERVER_IP:PORT / Records / Parsing

我已经在Codeanywhere中创build了一个项目来演示

webhook端点是: http : //port-1337.zavtt4t8a0jm7vigncyo3txxmuhxgvix3yxk66pvydgqfr.box.codeanywhere.com/records/create

为了检查数据,只需将/创build一部分url到/ find

Git回购是在这里: https : //github.com/dkatavic/webhook_for_aftership

你可以在你的服务器上克隆项目并运行它(或者使用我的服务器进行testing)

你可以通过捕获PUT请求

 app.put('/someRouteToCatchWebHook', function(request, response) { //webhook parsing goes here }); 

(我相信你在你的代码中使用了expressjs–详情参见http://expressjs.com/api.html#app.METHOD )。

如果webhook数据位于请求正文中,则可以使用https://www.npmjs.com/package/body-parser模块进行parsing。