2016-10-15 63 views
0

我是一名.NET開發人員,正在嘗試使用nodejs web api開發。如何在nodejs中創建模型

我在想,我們是否可以在nodej中創建模型,就像我們在asp.net web api中創建的一樣。

例如

public class BaseResponse 
{ 
    public bool Success { get; set; } 

    public string ErrorMessage { get; set; } 

} 

public class MovieResponse : BaseResponse 
{ 
    public int MovieId { get; set; } 

    public string MovieName { get; set; } 
} 

這是我們如何做到在C#。

如何在nodejs中創建此類模型。

任何npm包可用?

+0

你問是否可以創建類並使用繼承,或者你問是否可以用mssql做到這一點?這些是兩個不同的問題,可能有不同的答案。 – c1moore

+0

如何在nodejs中創建模型,並且也考慮繼承。 –

+1

用戶[sequelize.js](http://docs.sequelizejs.com/en/v3/)ORM – SpunkyLive

回答

1

有好消息,這裏有壞消息。壞消息是類和繼承的概念,因爲你不知道它來自其他語言。好消息是,JavaScript試圖沿着這個想法做一些事情(儘管它做了一個可憐的工作來實現它)。以下是您使用JavaScript提供的代碼示例:

function BaseResponse(success, errorMessage) { 
    this.success = success; 
    this.errorMessage = errorMessage; 
} 

function MovieResponse(success, errorMessage, movieId, movieName) { 
    BaseResponse.call(this, success, errorMessage); // Call the base class's constructor (if necessary) 

    this.movieId = movieId; 
    this.movieName = movieName; 
} 

MovieResponse.prototype = Object.create(BaseResponse); 
MovieResponse.prototype.constructor = MovieResponse; 

/** 
* This is an example of an instance method. 
*/ 
MovieResponse.prototype.instanceMethod = function(data) { /*...*/ }; 

/** 
* This is an example of a static method. Notice the lack of prototype. 
*/ 
MovieResponse.staticMethod = function(data) {/* ... */ }; 

// Instantiate a MovieResponse 
var movieResInstance = new MovieResponse(); 

Mozilla的確很好documentation on JavaScript and classes。在上面的代碼中,您正在創建兩個功能BaseResponseMovieResponse。當您使用new關鍵字時,這兩個函數都會用作具有適當「類」的對象的構造函數。您指定MovieResponse繼承自BaseMovieMovieResponse.prototype =Object.create(BaseResponse)。這有效地設置了MovieResponseprototype chain等於BaseResponse的原型鏈。你會注意到在設置了MovieResponse的原型鏈後,我必須將其構造函數設置爲指向MovieResponse。如果我沒有這樣做,每次你嘗試初始化一個MovieResponse,JavaScript都會嘗試去實例化一個BaseResponse(我告訴你他們做了一件很糟糕的工作)。

其餘的代碼應該是相對簡單的。通過在原型鏈上定義它們,您可以在全新的閃亮類中創建實例方法。如果您在BaseResponse上定義的功能未在MovieResponse上定義,但在MovieResponse的實例上調用該功能,則JavaScript將「抓取」原型鏈直到找到該功能。靜態方法直接在構造函數本身上定義(另一個奇怪的特性)。

注意沒有類型或訪問修飾符(公/私)的概念。你可以實現一些運行時技巧來實施類型,但是在JavaScript中通常是不必要的,而且更容易出錯和缺乏靈活性,而不是增加這些檢查就足夠了。

您可以使用比類型更直接的方法實現類的私有和受保護成員的概念。使用Node's require(),並假設你想叫一個私有函數privateMethod你可以實現它:

function privateMethod() { /* privateMethod definition */ } 

// Definition for MovieResponse's constructor 
function MovieResponse() { /*...*/ } 

module.exports = MovieResponse; 

我添了幾分需要評論,我不同意:無需在JavaScript中使用繼承。 JavaScript使用了一個名爲「duck typing」的概念(如果它看起來像一隻鴨子,聽起來像一隻鴨子,它的鴨子)。由於JavaScript是弱類型的,它不關心對象是BaseResponse還是MovieResponse,你可以調用任何方法或嘗試訪問你想要的任何字段。結果通常是錯誤或錯誤/容易出錯的代碼。我在這裏提到這個,因爲你可能會遇到這個概念及其支持者。知道這樣的編程是危險的,並導致不良編程實踐。

+0

我忘了提及有一些庫爲OOP語言添加類似於JavaScript的語法。想到的兩個是TypeScript和CoffeeScript。我也沒有經驗,所以我也不能多說。 – c1moore

+0

「截至2016年,不支持類和繼承的概念」,截至2016年,它在很多瀏覽器,Node.js和大多數(如果不是全部)轉譯器(如Babel)中。它只是基於原型的「類」和繼承的語法糖,但依然如此。 – Darkhogg

+0

我不知道[Node.js支持與類有關的所有ES6標準](https://nodejs.org/en/docs/es6/)。您是否有任何資源顯示默認支持哪些ES6標準?另外,如果你需要支持IE,[它還不支持類](http://kangax.github.io/compat-table/es6/#test-class)。 [根據Mozilla](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes),Opera也不支持類語法糖。 – c1moore