Meteor server api using iron router returns HTML 没有响应

Meteor server api using iron router returns HTML not the response

我有一个简单的 Meteor 应用程序,只是基本的 Meteor 创建测试。我希望能够将“/”目录的流量路由到模板。

我希望能够将数据从 facebook 网络挂钩路由到简单的 js 响应。

我的问题是,当我使用邮递员触发网络挂钩 URL 时,它 returns HTML 而不是我的回应。

我已经为我读过的其他帖子尝试了许多不同的选项,但现在只有最基本的版本才能让它正常工作。

这是我用过的代码

main.html

<head>
  <title>test</title>
</head>
<body>
</body>

<template name="home">
  <form class="new-message">
    <input type="text" name="message" placeholder="Testing">
  </form>
</template>

main.js:

import { Meteor } from 'meteor/meteor';
import { Router } from 'meteor/iron:router';
import { Template } from 'meteor/templating';
import './main.html';

Router.route('/', function () {
  this.render('home');
});

Router.route('/webhooks/facebook', function() {
    var request = this.request;
    var response = this.response;

    response.end('webhook was called');
  }, {
    where: 'server'
  });

所有其他文件都是使用 meteor create 创建的。

我使用的是 Meteor 版本 1.8.1

我正在使用 postman 测试网络挂钩这是创建的 GET URL: https://------.ngrok.io/webhooks/facebook?hub.verify_token=mytoken&hub.challenge=1234567&hub.mode=subscribe

省略代码以防止 ngrok 受到猛烈攻击。

这是我收到的回复:

<html>

<head>
    <link rel="stylesheet" type="text/css" class="__meteor-css__"
        href="/merged-stylesheets.css?hash=6b1f9f6fb78291ae58da8ec4f36476931155453c">
    <title>simplechat</title>

</head>

<body>
    <script type="text/javascript">
        __meteor_runtime_config__ = JSON.parse(decodeURIComponent("%7B%22meteorRelease%22%3A%22METEOR%401.8.1%22%2C%22meteorEnv%22%3A%7B%22NODE_ENV%22%3A%22development%22%2C%22TEST_METADATA%22%3A%22%7B%7D%22%7D%2C%22PUBLIC_SETTINGS%22%3A%7B%7D%2C%22ROOT_URL%22%3A%22http%3A%2F%2Flocalhost%3A3000%2F%22%2C%22ROOT_URL_PATH_PREFIX%22%3A%22%22%2C%22autoupdate%22%3A%7B%22versions%22%3A%7B%22web.browser%22%3A%7B%22version%22%3A%22b22f1ad86c0a904c992885256b7de72ed2863e1d%22%2C%22versionRefreshable%22%3A%22a580e09175421ec6994fc6da61a0413f3a15d2b1%22%2C%22versionNonRefreshable%22%3A%22fc4ded0006de942fe57524f94d500abeb4569d6f%22%7D%2C%22web.browser.legacy%22%3A%7B%22version%22%3A%222571a76ffc344fbc5b40ade303255cbbc59e2682%22%2C%22versionRefreshable%22%3A%22a580e09175421ec6994fc6da61a0413f3a15d2b1%22%2C%22versionNonRefreshable%22%3A%22dc1e886b7786e303655c010220e9f502e82dcf1c%22%7D%7D%2C%22autoupdateVersion%22%3Anull%2C%22autoupdateVersionRefreshable%22%3Anull%2C%22autoupdateVersionCordova%22%3Anull%2C%22appId%22%3A%22zqskgg1xifoj.hlnqbjmcma6f%22%7D%2C%22appId%22%3A%22zqskgg1xifoj.hlnqbjmcma6f%22%2C%22isModern%22%3Afalse%7D"))
    </script>

    <script type="text/javascript" src="/packages/meteor.js?hash=857dafb4b9dff17e29ed8498a22ea5b1a3d6b41d"></script>
    <script type="text/javascript" src="/packages/meteor-base.js?hash=29010b127daf4ebacaaf9db9b8a61487e57d7d86">
    </script>
    <script type="text/javascript" src="/packages/mobile-experience.js?hash=2751f9ec11102d1106042c462b340c3fcfcb1990">
    </script>
    <script type="text/javascript" src="/packages/modules-runtime.js?hash=d3c3e5d67c95f97a60888bda7373292efad3be5e">
    </script>
    <script type="text/javascript" src="/packages/modules.js?hash=e8b7455d5562fec1444a3c6882cdc6639055cfca"></script>
    <script type="text/javascript" src="/packages/modern-browsers.js?
    <script type="text/javascript" src="/packages/autoupdate.js?hash=6d56c0f3a885390c688b4f3f893d96d1280fd0ee"></script>

---- Cut out all of the other script calls to keep this short -----

    <script type="text/javascript" src="/app/global-imports.js?hash=1f8a1ae2e343994912f72f1dc6eec1ca7df24cae"></script>
    <script type="text/javascript" src="/app/app.js?hash=70cfa37cd2f85e533f69d7312d02ef8984eae01a"></script>

</body>

</html>

所以基本上是 returns HTML.

我确定我遗漏了一些简单的东西。

在此先感谢您的帮助。通常我会等到用尽所有其他选项后再发帖。而且我确定我已经尝试了 Whosebug 上给出的所有其他示例。

我想要的结果很简单 return HTTP 响应 "webhook was called" 而不是 HTML 垃圾。

很长一段时间没有使用 iron 路由,但据我所知,您想将服务器端路由更改为以下内容,因为它适用于 restful 路由。

Router.route('/webhooks/facebook', { where: 'server' })
    .get(function () {
    // GET 
  })
  .post(function () {
    // POST 
  })
  .put(function () {
    // PUT 
  })

你可以使用这样的东西:

Router.map(function(){

  this.route("routeName", {path: "/url/:param1/:optionalParam?,
    where: "server",
    action: function(){
        var param = this.params.param1;
        this.response.writeHead(200, {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*'
        });
        //authenticate call and decrypt body
        if (this.request.method == 'POST') {
        //do something
        }
        if (this.request.method == 'GET') {
        //do something
        }
    }
});

this.route("abc", {path: "/api/get/user/activity/:temp1",
    where: "server",
    action: function(){
        //proceed as above
    }
  });
});

如需帮助,请通读 https://iron-meteor.github.io/iron-router/#server-routing

路由器文件应保存在服务器文件夹中(用于服务器端路由)

对于那些一直在努力让服务器和客户端路由在同一个 Meteor 应用程序上工作的其他人来说,这里是解决方案。

Iron routers 最新版本要求所有服务器端路由都在服务器端,您必须从启动时触发它们。

所有客户端路由都在客户端添加,并包含在客户端的main.js中。

我的简单测试是这样的:

meteor create test

然后在clients/main.html替换当前代码,添加一个简单的模板如下:

<head>
  <title>newroutetest</title>
</head>

<body>

</body>

<template name="home">
  <h1>Home</h1>
</template>

然后在client/main.js中添加你的客户端路由如下:

import { Template } from 'meteor/templating';
import './main.html';

Router.route('/', {
  template: 'home'
});

现在我们在文件server/main.js中设置服务器端路由,你在启动部分添加路由如下:

import { Meteor } from 'meteor/meteor';

Meteor.startup(() => {

  Router.route('/webhook', function () {
    var req = this.request;
    var res = this.response;
    res.end('hello from the server\n');
  }, {where: 'server'});

});

就是这样 我希望这可以帮助其他一直在为此苦苦挣扎的人。