2015-05-25 2 views
9

के साथ वेबहुक वास्तव में इस काम को पाने के लिए संघर्ष कर रहे हैं। मेरे पास सामग्री में एक वेबहूक परिभाषा सेटअप है। जब मैं सामग्री में एक प्रविष्टि प्रकाशित करता हूं तो यह webhooks.example.com पर HTTP पोस्ट अनुरोध भेजता है।सामग्री और नोड

उस सबडोमेन में मेरे पास अनुरोध स्वीकार करने के लिए एक नोडजेएस सर्वर चल रहा है। मैंने Contentful API docs पर देखा है, जो कहता है कि अनुरोध निकाय में नई प्रकाशित प्रविष्टि होनी चाहिए।

मैंने अनुरोध प्राप्त करने के 2 तरीके की कोशिश की है, जिनमें से कोई भी मुझे अनुरोध निकाय के लिए कुछ भी नहीं दे रहा है। सबसे पहले मैं 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); 
}); 

यहाँ अनुरोध के माध्यम से आता है और मैं संदेश An entry was published मिलता है लेकिन req.body अनिर्धारित रहता है। यदि मैं इसके बजाय console.log(req) करता हूं, तो मैं पूर्ण अनुरोध ऑब्जेक्ट देख सकता हूं, जिसमें शरीर शामिल नहीं है।

तो मैं तो एक बुनियादी एक्सप्रेस सर्वर चल रहा सब पोस्ट अनुरोध को स्वीकार करने की कोशिश की: फिर इस के साथ

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); 
}); 

, मैं Incoming request संदेश मिलता है लेकिन req.body खाली है। मुझे पता है कि यह विधि गलत है क्योंकि मैंने अपना वेबहूक उपयोगकर्ता नाम/पासवर्ड नहीं उपयोग किया है।

मैं आने वाले वेबहूक अनुरोधों को सही ढंग से कैसे प्राप्त करूं और शरीर की सामग्री कैसे प्राप्त करूं?

+0

सबसे पहले यह कहीं छड़ी: आप का उपयोग करने के भूल 'app.listen (#portNumber)'। मैंने उस पंक्ति को जोड़ा और कंटेंटफुल-वेबहूक-सर्वर से 'कर्ल' उदाहरण का प्रयास किया: 'curl -X POST --header "एक्स-कंटेंटफुल-टॉपिक: ContentManagement.Entry.publish" localhost: # portNumber'। यह मेरे लिए काम किया। क्या आपको अभी भी उस लाइन को जोड़ने के बाद कोई समस्या है? – Dodekeract

+0

@FlorianW। हां मेरे पास 'app.listen' कोड था, बस ऊपर मेरे उदाहरण में नहीं। यह आने वाले अनुरोध प्राप्त करता है, लेकिन प्रवेश के रूप में प्रवेश शरीर में शामिल नहीं है। ऐसा लगता है कि यह सामग्री के लिए एपीआई दस्तावेज़ों के अनुसार होना चाहिए। – Coop

+0

क्या आपने 'req.pipe (process.stdout) का उपयोग करके आने वाले स्ट्रीम को अपने कंसोल पर लिखने का प्रयास किया है; उदाहरण के लिए? आने वाला संदेश प्रकार https://nodejs.org/api/http है।एचटीएमएल # http_http_incomingmessage जहां तक ​​मैं एनपीएम मॉड्यूल दस्तावेज़ों से देख सकता हूं .. –

उत्तर

8

contentful-webhook-server req का विश्लेषण नहीं करता है जिससे यह समझाएगा कि यह आपको कॉलबैक में शरीर को क्यों नहीं पहुंचाता है।

आपका सर्वर सही प्रतीत होता है लेकिन ऐसा लगता है कि सामग्रीपूर्ण के पास एक कस्टम जेसन प्रकार है जिसे type-is लाइब्रेरी द्वारा पहचाना नहीं गया है।

सामग्री प्रकार की तरह 'आवेदन/vnd.contentful.management.v1 + json' लग रहा है

अपने सर्वर शायद अगर आप body-parser इस कस्टम सामग्री प्रकार स्वीकार कर काम करेंगे। उदाहरण के लिए:

app.use(bodyParser.json({type: 'application/*'})); 

यदि यह काम करता है, तो आप स्वीकार किए गए प्रकार पर अधिक विशिष्ट हो सकते हैं।

रिकॉर्ड के लिए:

typeis.is('application/vnd.contentful.management.v1+json', ['json']) 
=> false 
+0

बिल्कुल सही उत्तर +1 – sidonaldson

0

एक आसान विकल्प के बाद से हम जानते हैं कि यह वास्तव में JSON रिटर्न कस्टम Content-Type संशोधित करने के लिए है। बस सब से ऊपर की bodyParser

app.use(function(req, res, next) {  
    if (req.headers['content-type'] === 'application/vnd.contentful.management.v1+json') req.headers['content-type'] = 'application/json'; 
    next(); 
}); 
संबंधित मुद्दे