Thực sự đấu tranh để làm việc này. Tôi có một thiết lập định nghĩa webhook trong Contentful. Khi tôi xuất bản một mục trong Contentful, nó sẽ gửi một yêu cầu HTTP POST tới webhooks.example.com.Webhooks với Contentful và nút
Tại subdomain mà tôi có một máy chủ NodeJS chạy chấp nhận yêu cầu. Tôi đã xem số Contentful API docs, cho biết cơ thể yêu cầu phải chứa mục mới được xuất bản.
Tôi đã thử 2 phương pháp nhận được yêu cầu, không phải trong số đó được đem lại cho tôi bất cứ điều gì cho cơ thể theo yêu cầu. Đầu tiên tôi đã cố gắng module contentful-webhook-server NPM:
var webhooks = require("contentful-webhook-server")({
path: "/",
username: "xxxxxx",
password: "xxxxxx"
});
webhooks.on("ContentManagement.Entry.publish", function(req){
console.log("An entry was published");
console.log(req.body);
});
webhooks.listen(3025, function(){
console.log("Contentful webhook server running on port " + 3025);
});
Ở đây, yêu cầu đi qua và tôi nhận được thông báo An entry was published
nhưng req.body
là undefined. Nếu tôi làm console.log(req)
thay vào đó, tôi có thể thấy đối tượng yêu cầu đầy đủ, không bao gồm nội dung.
Vì vậy, tôi sau đó đã cố gắng chạy một máy chủ cơ bản Express để chấp nhận tất cả các yêu cầu POST:
var express = require("express"),
bodyParser = require("body-parser"),
methodOverride = require("method-override");
var app = express();
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("X-HTTP-Method-Override"));
app.post("/", function(req, res){
console.log("Incoming request");
console.log(req.body);
});
Một lần nữa với điều này, tôi nhận được thông Incoming request
nhưng req.body
trống. Tôi biết phương pháp này là sai vì tôi chưa sử dụng tên người dùng/mật khẩu webhook của mình.
Làm thế nào để tôi nhận được một cách chính xác các yêu cầu webhook đến và nhận được nội dung cơ thể?
Trước hết: Bạn quên sử dụng 'app.listen (#portNumber)'. Tôi đã thêm dòng đó và thử ví dụ 'curl' từ contentful-webhook-server:' curl -X POST - tiêu đề "X-Contentful-Topic: ContentManagement.Entry.publish" localhost: # portNumber'. Nó làm việc cho tôi. Bạn vẫn nhận thấy bất kỳ vấn đề nào sau khi thêm dòng đó? – Dodekeract
@FlorianW. Có, tôi có mã 'app.listen', không có trong ví dụ trên. Nó nhận được các yêu cầu đến, nhưng mục nhập không được bao gồm trong cơ thể như mong đợi. Dường như nó phải theo tài liệu API cho Contentful. – Coop
bạn đã thử viết luồng đến vào bảng điều khiển của mình bằng cách sử dụng 'req.pipe (process.stdout);' chẳng hạn? Tin nhắn đến có kiểu https://nodejs.org/api/http.html # http_http_incomingmessage theo như tôi thấy từ tài liệu mô-đun npm .. –