【问题标题】:connecting mongodb, backbone, grunt task & heroku连接 mongodb、backbone、grunt task 和 heroku
【发布时间】:2015-03-20 14:23:27
【问题描述】:

我已经创建了我的应用程序的基本前端结构,并将其设置为部署到 Heroku。我遵循了 heroku 入门(使用 node.js)教程,一切似乎都运行良好,因为我可以看到它在我的 localhost 和在线上运行。我还使用 express 驱动程序成功安装了 MongoDB,并从位于根目录的 index.js 文件连接到它。我可以从我的 git bash 终端的控制台日志中看到此连接成功。

我的主干应用程序位于根目录上名为“Public”的文件夹中,Grunt 将其压缩为 1 个文件,该文件放置在根目录下名为“lib”的文件夹中。

我想知道如何从主干视图中访问我的数据库?

我遵循了这个例子:Populate Backbone Marionette Views with data from Mongoose using Express Route 但我没有看到与 index.js 和主干视图的联系以及它们如何交互。我也对 /cats json 文件的位置感到困惑?

我的文件夹结构是这样的:

public
--css
--fonts
--img
--js
--lib
--scss

lib
--minified-javascript-app.js

index.js
Gruntfile.js

我的 index.js 文件如下所示:

var express = require('express');
var app = express();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
  console.log("mongoose: connected");
});

var myDbSchema = mongoose.Schema({
    name: String
});

myDbSchema.methods.logName = function () {
  var name = this.name
    ? "The name of the site is " + this.name
    : "This one don't have a name"
  console.log(name);
}

Cats = mongoose.model('Cats', myDbSchema);

var dublinCat = new Cats({ name: 'Catty1' });
console.log(dublinCat.name);

var londonCat = new Cats({ name: 'Catty1' });
londonCat.logName();

londonCat.save(function (err, cats) {
  if (err) return console.error(err);
  console.log("All sites: ",cats);
});

//end of mongoos db stuff

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));

app.get('/', function(request, response) {
  response.send('Hello World!');
});

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'));
});

【问题讨论】:

    标签: node.js mongodb backbone.js gruntjs


    【解决方案1】:

    我不太确定你是如何在 nodejs 上做事的。

    要获取主干视图所需的数据,您必须使用模型/集合。

    型号:

    主干是构成项目基础的领域对象的表示形式。您将为每个主干模型定义一个 urlRoot 属性。这将识别将从服务器返回数据的服务器端资源(一个安静的服务)。主干模型提供了获取和保存数据的隐式方法。当您从模型中调用 fetch 方法时,将使用 urlRoot 将 get 请求传递给服务器,并将 id(您的域对象的唯一 id)附加到 url。

    EG:

    var User = Backbone.Model.extend({
        // Defined if the name of the domain object identifier is different
        // from 'id'
        idAttribute : "userId",
        urlRoot : '/rest/user'
    });
    
    var user = new User();
    user.set('userId',1);
    user.fetch({
        success : function(model, response, options) {
           // handle success 
        },
        error : function(model, response, options) {
          // handle failure
        }
    });
    

    假设我的应用在'http://localhost/usermanagement'上运行,那么GET请求url如下:

    http://localhost/usermanagement/rest/user/1

    因此,在您的节点服务器上,您需要创建并注册一个可以处理请求“rest/user”并输入“GET”的方法。同样,您需要为同一 URL 注册 POST、PUT 和 DELETE 方法来处理 save() 和 destroy()。

    收藏:

    Backbone 集合是一组模型。对于每个集合,您可以定义一个“url”属性,您可以使用该属性从服务器获取数据。例如,您可以为用户列表创建一个集合并从服务器获取它们。

    http://addyosmani.github.io/backbone-fundamentals/#exercise-2-book-library---your-first-restful-backbone.js-app

    在上面的链接中有一个简单且很好的使用 nodejs 的骨干示例。

    在设计方面,最好有一个 EventBus(一个自定义的 javascript 对象)来完成创建视图所需的模型/集合的工作并进行获取。然后它创建一个视图并将获取的模型/集合传递给它,以呈现数据。

    1. 主干路由器处理客户端路由并委托给 EventBus。
    2. EventBus 创建视图所需的模型/集合并进行提取。
    3. 在获取之后,它还会创建 Backbone 视图对象并将获取的模型/集合传递给它。
    4. 视图呈现数据。

    【讨论】:

    • 嗨巴拉吉,感谢您的回复。我了解主干模型和集合以及如何以您解释的方法检索数据。我的问题在于我的 MongoDB 设置。当我从我的主干视图和模型中调用我的数据库时,它说我的“架构”/“数据库模型名称”是未定义的。我需要与 mongoos 建立连接,并在 index.js 中需要 express 等,但是我如何从我的 Backbone 模型中调用我的数据库。如果我定义一个 urlRoot,那么 url 指向哪里?它不能是 localhost,因为当我将它在线部署到 heroku 时,它不起作用..
    • 'urlRoot' 将是您的 REST 资源已映射到的路径。所以如果app是你的'express'对象实例并且你在urlRoot中指定'/rest/user',那么你应该有类似app.get('/rest/user/:id',callback)的东西,在你连接的回调中到您的数据库,获取数据并将其返回。
    • 如果您的主干客户端代码和您的服务器端代码在不同的环境中运行,那么您应该使用 $.ajaxPrefilter 并覆盖选项中的 url 属性,使用您的服务器端代码运行的确切基本 url .默认情况下,Backbone 会将 urlRoot 附加到您的客户端代码正在运行的当前 url 基础上。
    • 好的,我相信我错过了创建 REST 服务所需的步骤。我将研究如何使用 mongodb 执行此操作。谢谢巴拉吉
    猜你喜欢
    • 2020-11-12
    • 2015-08-11
    • 2020-02-03
    • 2020-10-07
    • 2017-07-02
    • 2016-06-20
    • 2021-04-05
    • 2019-12-03
    • 2023-03-12
    相关资源
    最近更新 更多