【问题标题】:Can Meteor's Backbone Router handle POST requests?Meteor 的骨干路由器可以处理 POST 请求吗?
【发布时间】:2015-01-05 16:55:15
【问题描述】:

我有一个 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

谢谢!

【问题讨论】:

  • backbone 不是客户端专用路由器吗?如果是这样,那么答案是否定的。
  • 您可以使用iron-router 来处理 POST 请求,如本答案所述:stackoverflow.com/questions/20943084/…
  • 谢谢。我一直在犹豫是否要使用Iron-Router,因为对于看似简单的问题来说,这似乎是一个很大的补充。我不清楚如何将它与Backbone.Router 结合起来。但是我现在已经通过一些修改让它工作了。我会写一个简短的答案来更好地描述它。

标签: post backbone.js meteor


【解决方案1】:

以下是我从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 请求,通过在action 中包含console.log 进行测试(这将写入运行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 破坏了。将这些包裹在 ifs 中修复它们。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多