2014-01-21 114 views
-3

我正在構建我的第一個節點/ express/mongoose應用程序。我被困在此錯誤:貓鼬,我在哪裏定義模型

500的ReferenceError:ServerModel沒有定義

下面是文件 「路線/ input.js」。我無法弄清楚我做錯了什麼,在我嘗試使用它之前,模型已經明確定義。

exports.verify = function(req, res){ 
var mongoose = require('mongoose'); 

var serverSchema = new mongoose.Schema({ 
    name: { type: String, unique: true }, 
    os: String, 
    osVersion: String, 
    createdOn: {type: Date, default: Date.now }, 
    modifiedOn: Date, 
    cores: Number, 
    memoryGB: Number, 
    licenses: [licenseSchema] 
}); 
var licenseSchema = new mongoose.Schema({ 
    name: String, 
    createdOn: {type: Date, default: Date.now }, 
    modifiedOn: Date 
}); 

mongoose.model('ServerModel', serverSchema); 

    var inputVar = new ServerModel({ 
    name: req.param.name, 
    os: req.param.OS, 
    osVersion: req.param.OSv 
    }); 
    res.render('input', { title: 'verify' }); 
}; 
+0

我現在能夠使用的模型,但我仍然有一個問題。 OverwriteModelError:編譯後無法覆蓋'Server'模型。 我想我明白爲什麼,因爲每次調用路徑時都會嘗試再次定義模型。我需要在其他地方定義模型......但我不確定在哪裏。 – xdaxdb

+0

我認爲這個問題是一個令人憎惡的問題,我想刪除,因爲我不認爲我的問題得到了回答,並且它只是佔用了互聯網上的空間。 – xdaxdb

+0

然後刪除它。我花了很多時間回答這個問題(甚至讓你成爲一個令人毛骨悚然的gif),所以我猜如果你會說這不是一個真正的答案,那麼無論如何;也許你應該問更好的問題。祝你好運。 – Chev

回答

1

你的備選答案,因爲你剛剛起步的:mongoose-simpledb

Disclaimer: I wrote it.

The glitch that caused the name field not to show up at the end in the above gif was actually user error. During a test I inserted an identical record with the same username and it didn't have the name field. The final retrieval of the user actually retrieves that user instead of the second one :/

它讓你在你的應用程序的根目錄(或者你在選項指定的任何文件夾)定義在「dbmodels」文件夾中的單獨的文件中所有的模式的。示例模型/模式文件如下所示:

// /dbmodels/Book.js 

exports.schema = { 
    title: String, 
    publishDate: Date, 
    authorName: { 
     first: String 
     last: String 
    } 
}; 

請注意,貓鼬需要模式的對象是完全相同的。您還可以在模型文件中定義方法和虛擬屬性。這裏有讓你得到並且即使沒有存儲在數據庫中的文件這樣的屬性設置authorName.full屬性的示例虛擬財產:

// /dbmodels/Book.js continued... 

exports.virtuals = { 
    'authorName.full': { 
     get: function() { 
      return this.authorName.first + ' ' + this.authorName.last; 
     }, 
     set: function (fullName) { 
      if (fullName.indexOf(' ') !== -1) { 
       var names = fullName.split(' '); 
       this.authorName.first = names[0]; 
       this.authorName.last = names[1]; 
      } else { 
       this.authorName.first = fullName; 
       this.authorName.last = ''; 
      } 
     } 
    } 
}; 

一旦你有你的模型文件設置您希望他們初始化你的數據庫非常容易。

// app.js 

var simpledb = require('mongoose-simpledb'); 

simpledb.init('mongodb://localhost/test', function (err, db) { 
    if (err) return console.error(err); 
    // Now you can access your models via the db object. Example: 
    db.Book.find({ title: "Pale Blue Dot" }, function (err, books) { 
     // ... 
    }); 
    // This is a great place to put your application code, such as an 
    // express app and then pass the db object wherever you need it :) 
}); 

我寫了這個模塊,使它更容易做到與Mongoose 98%的用例。最終你只需要一個單一的對象與你的所有模型,所以你可以使用它作爲你的數據層的API。這個模塊完成所有這些。所有你需要通過的是你的連接字符串,你很好去。但是,您也可以傳遞選項對象來代替連接字符串,並配置某些內容以滿足您的需要(請參見README)。

我也把一個Node.js & MongoDB 101視頻最近(不是貨幣化),如果這能幫助:)

+0

您是否在沒有模塊(或其他模塊)的情況下在不同的路線上重複使用相同的模型是不可能的? 因爲我在使用2條路線上的相同模型時遇到了問題。 – xdaxdb

+0

當然,您可以在多條路線上使用相同的模型。我所有的模塊都是通過給你一個擁有所有模型的單個數據庫對象來讓事情變得更直接。如果沒有我的模塊,你絕對可以做我所做的一切。 simpledb只是提供了一個簡單的結構,所以它更容易設置。在我的示例中,您可以通過db對象獲取模型,並且可以在任何需要的位置訪問該對象。查看[自述文件](https://github.com/chevex/mongoose-simpledb/blob/master/README.md)。 – Chev

+0

@AlexFord爲什麼我會遇到'mongoose-simpledb'類似的錯誤?我以前用過它,沒有任何問題。但我有一個相對較新的項目只有一個模型,我得到這個:http://i.imgur.com/Xu3H8ah.png 任何想法可能是錯的? – Antrikshy

3

你需要說:

var ServerModel = mongoose.model('ServerModel', serverSchema); 
+1

是的,它現在有用,謝謝。我一直在閱讀的這本書顯示了它最初的樣子。也許這本書已經過時了? 現在一切正常,我可以從mongo CLI中看到數據庫中的數據,但它只能工作1次。如果我嘗試重新加載頁面,它會給我這個錯誤。 OverwriteModelError:編譯後無法覆蓋'ServerModel'模型。 如果我重新啓動應用程序,我可以使用它再添加1個條目到數據庫,然後必須重新啓動它。 – xdaxdb

+1

不要忘了標記答案正確,如果它幫助你:) – Chev

+0

我不得不拿掉「正確」的狀態,因爲我還不知道在哪裏定義模型。我在錯誤的地方調用它,目前每次有人加載頁面時都會定義它,這給我帶來了錯誤。 @Daniel Flippance糾正了我如何定義它,而不是在哪裏。謝謝 – xdaxdb