API сервера Meteor с использованием железного маршрутизатора возвращает HTML, а не ответ

У меня есть простое приложение 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>

основной.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'
  });

Все остальные файлы точно такие же, как и при создании метеора.

У меня Метеор версии 1.8.1

Я использую postman для проверки веб-хука, это созданный URL-адрес GET: 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>

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

Я уверен, что упускаю что-то простое.

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

Мой желаемый результат прост, чтобы просто вернуть HTTP-ответ «вызван веб-перехватчик» вместо HTML-мусора.


person Famous Internet Programmer    schedule 27.09.2019    source источник


Ответы (3)


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

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

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

person user3807691    schedule 28.09.2019
comment
Спасибо за ваш комментарий, но Router.map устарел и больше не является частью iron:router. - person Famous Internet Programmer; 28.09.2019

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

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

person Derrick Gremillion    schedule 27.09.2019
comment
Привет, Деррик! Большое спасибо за помощь. Я попытался использовать Router.route('/webhooks/facebook', {где: 'сервер' }) .get(function() { var request = this.request; var response = this.response this.response.end('webhook назывался'); }); - person Famous Internet Programmer; 27.09.2019
comment
И все то же самое. - person Famous Internet Programmer; 27.09.2019

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

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

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

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

meteor create test

Затем в client/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'});

});

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

person Famous Internet Programmer    schedule 28.09.2019