API сервера метеора, использующий железный маршрутизатор, возвращает HTML, а не ответ - PullRequest
1 голос
/ 27 сентября 2019

У меня есть простое приложение Meteor, только базовый тест создания метеора.Я хочу иметь возможность перенаправлять трафик в каталог "/" на шаблон.

Я хочу иметь возможность перенаправлять данные из веб-хука facebook в простой ответ js.

Моя проблема в том, что когда я запускаю URL веб-хука с помощью почтальона, он возвращает 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

Я использую почтальон для тестирования веб-хукаэто созданный URL GET: https: //------.ngrok.io/webhooks/facebook? hub.verify_token = mytoken & hub.challenge = 1234567 & hub.mode = подписка

код опущен, чтобы не дать 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>

Так что в основном он возвращает HTML.

Я уверенМне не хватает чего-то простого.

Заранее спасибо за помощь.Обычно я жду, пока не исчерпал все остальные варианты, прежде чем публиковать здесь.И я уверен, что я пробовал все остальные примеры, приведенные здесь, в StackOverflow.

Мой желаемый результат - просто вернуть HTTP-ответ «webhook вызван» вместо HTML-мусора.

Ответы [ 3 ]

1 голос
/ 28 сентября 2019

Вы можете использовать что-то вроде этого:

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

Файл маршрутизатора должен быть сохранен в папке сервера (для серверных маршрутов)

0 голосов
/ 28 сентября 2019

Для тех, кто изо всех сил пытался заставить и серверные, и клиентские маршруты работать в одном приложении Meteor, вот решение.

В новейшей версии Iron Routers требуется, чтобы все серверные маршруты были на стороне сервера, и выдолжен запустить их при запуске.

Все клиентские маршруты добавляются на стороне клиента и включаются в main.js на стороне клиента.

Мой простой тест был таким:

meteor create test

Затем в клиентском / 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'});

});

Вот и все, надеюсь, это поможет другим, ктоборолся с этим.

0 голосов
/ 27 сентября 2019

Долгое время не использовали железный маршрут, но, насколько я помню, вы хотите изменить свой серверный маршрут на следующий, как и для остальных маршрутов.

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