Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有Contentful和node的webhook_Javascript_Node.js_Express_Webhooks_Contentful - Fatal编程技术网

Javascript 带有Contentful和node的webhook

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")({

真的很难让它工作。我有一个Contentful中的webhook定义设置。当我以Contentful发布条目时,它会向webhooks.example.com发送一个HTTP POST请求

在该子域中,我有一个NodeJS服务器正在运行以接受请求。我已经看过了,它说请求主体应该包含新发布的条目

我尝试了两种接收请求的方法,但这两种方法都没有为请求主体提供任何信息。首先,我尝试了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);
});
这里请求通过,我得到消息
一个条目已发布
,但是
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,很抱歉,但根据您的描述,这就是它的工作原理。