Meteor的骨干路由器可以处理POST请求吗?

时间:2014-03-11 10:08:34

标签: post backbone.js meteor

我有一个Meteor应用程序,它根据样本Todos app使用路由器,例如:

var TodosRouter = Backbone.Router.extend({
  routes: {
    ":list_id": "main"
  },
  main: function (list_id) {
    ...
  },
  ...
});

Router = new TodosRouter;

我有一个外部服务,通过对我指定的URL的POST请求完成后通知我。收到POST请求后,需要执行一些功能。我可以将此设置与上述框架一致吗?如果没有,我最好编写一个单独的非Meteor(例如nodejs)应用程序来处理POST,还是有办法让它在Meteor中工作?

我知道thisthisthis StackOverflow问题类似,但没有一个答案解释了如何使用Backbone.Router

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是我从Backbone.Router迁移到Iron-Router的方式。我看不到同时使用它们的方法。

首先,我将@Christian Fritz的answer中的代码放在server文件夹中:

Router.map(function () {
    this.route('foo', {
        path: '/foo',
        where: 'server',
        action: function() {
            if (this.request.method == 'POST') {
                console.log('post request received');
            } else {
                this.response.writeHead(404);
            }
        }
    })
});

处理POST请求,通过在console.log中包含action进行测试(将写入运行meteor的终端窗口),然后输入:

curl --data "p=bar" localhost:3000/foo

然后我将Backbone.Router调用替换为client文件夹中的代码,如Iron-Router docs中所述,例如

Router.configure({
    layoutTemplate: 'layout'
});

Router.map(function () {
    this.route('home', {
        path: '/',
        template: 'homepage',
    });
});

然后我不得不重写我的模板,以便从不同的模板生成页面,而不是从不同的Session变量设置生成。这实际上简化了我的代码,例如。而不是:

<body>
    {{#if onPage 'home'}}
        {{> homepage }}
    {{/if}}
    {{#if onPage 'help'}}
        {{> helppage }}
    {{/if}}
    ...
</body>

UI.registerHelper("onPage", function(name) { 
    return Session.equals('page', name);
});

只是:

<template name="layout">
    {{>yield}}
</template>

任何需要将用户定向到特定页面的JavaScript都使用Router.go()和路径名称:

Router.go('home');

除此之外,我找到了一些地方,我以前可以假设我的馆藏.findOne()找到了一个,但似乎已经破坏了Iron-Router。在if中修改这些内容会修复它们。

在Meteor 0.8中,要检查您所在的页面,您可以使用(see here):

Router.current().lookupProperty('template')