Javascript 带有Contentful和node的webhook
真的很难让它工作。我有一个Contentful中的webhook定义设置。当我以Contentful发布条目时,它会向webhooks.example.com发送一个HTTP POST请求 在该子域中,我有一个NodeJS服务器正在运行以接受请求。我已经看过了,它说请求主体应该包含新发布的条目 我尝试了两种接收请求的方法,但这两种方法都没有为请求主体提供任何信息。首先,我尝试了NPM模块:Javascript 带有Contentful和node的webhook,javascript,node.js,express,webhooks,contentful,Javascript,Node.js,Express,Webhooks,Contentful,真的很难让它工作。我有一个Contentful中的webhook定义设置。当我以Contentful发布条目时,它会向webhooks.example.com发送一个HTTP POST请求 在该子域中,我有一个NodeJS服务器正在运行以接受请求。我已经看过了,它说请求主体应该包含新发布的条目 我尝试了两种接收请求的方法,但这两种方法都没有为请求主体提供任何信息。首先,我尝试了NPM模块: var webhooks = require("contentful-webhook-server")({
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);
});
这里请求通过,我得到消息一个条目已发布
,但是req.body
未定义。如果我改为console.log(req)
,我可以看到完整的请求对象,它不包括body
因此,我尝试运行一个基本的Express服务器来接受所有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);
});
同样,我得到了传入请求
消息,但是req.body
是空的。我知道这个方法是错误的,因为我没有使用我的webhook用户名/密码
如何正确接收传入的webhook请求并获取正文内容?有内容的webhook服务器不解析请求,因此可以解释为什么它不在回调中向您提供正文 您的服务器似乎是正确的,但contentful似乎有一个自定义json类型,而
类型is
库无法识别该类型
内容类型类似于“application/vnd.contentful.management.v1+json”
如果使主体解析器
接受此自定义内容类型,服务器可能会工作。例如:
app.use(bodyParser.json({type: 'application/*'}));
如果这样做有效,您可以更具体地说明接受的类型
记录在案:
typeis.is('application/vnd.contentful.management.v1+json', ['json'])
=> false
一个更简单的选择是修改自定义的
内容类型
,因为我们知道它实际上返回JSON
。只需将其粘贴在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();
});
首先:你忘了使用
应用程序。听(#端口号)
。我添加了这一行,并尝试了来自contentful webhook服务器的curl
示例:curl-X POST--header“X-contentful-Topic:ContentManagement.Entry.publish”localhost:#portNumber
。这对我有用。添加那一行后,你还注意到什么问题吗?@Florian。是的,我有应用程序。听着
代码,只是在我上面的例子中没有。它接收传入的请求,但条目未按预期包含在正文中。根据API文档,它看起来应该是Contentful的。您是否尝试过使用req.pipe(process.stdout)将传入流写入控制台代码>例如?从npm模块文档中我可以看到传入消息的类型。您可以尝试与contentful webhook服务器一起使用吗?因为我没有一个内容丰富的帐户,所以我无法单独测试它。听起来像你在说:站点1向站点2发送一个CGI请求。站点2获取查询字符串内容,但不获取站点1的正文。这不是CGI的工作方式吗?例如,如果“站点1”是我的网站,“站点2”是Facebook.com,如果我调用他们的API,我真的希望Facebook访问我的网页正文吗?不,如果我不理解Webhooks,很抱歉,但根据您的描述,这就是它的工作原理。