2016-10-15 29 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