如何在nodejs中创建模型
我是一名.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包可用?
有好消息,这里有坏消息。坏消息是类和继承的概念,因为你不知道它来自其他语言。好消息是,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。在上面的代码中,您正在创建两个功能BaseResponse
和MovieResponse
。当您使用new
关键字时,这两个函数都会用作具有适当“类”的对象的构造函数。您指定MovieResponse
继承自BaseMovie
与MovieResponse.prototype =
Object.create(BaseResponse)
。这有效地设置了MovieResponse
的prototype 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,你可以调用任何方法或尝试访问你想要的任何字段。结果通常是错误或错误/容易出错的代码。我在这里提到这个,因为你可能会遇到这个概念及其支持者。知道这样的编程是危险的,并导致不良编程实践。
我忘了提及有一些库为OOP语言添加类似于JavaScript的语法。想到的两个是TypeScript和CoffeeScript。我也没有经验,所以我也不能多说。 – c1moore
“截至2016年,不支持类和继承的概念”,截至2016年,它在很多浏览器,Node.js和大多数(如果不是全部)转译器(如Babel)中。它只是基于原型的“类”和继承的语法糖,但依然如此。 – Darkhogg
我不知道[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
你问是否可以创建类并使用继承,或者你问是否可以用mssql做到这一点?这些是两个不同的问题,可能有不同的答案。 – c1moore
如何在nodejs中创建模型,并且也考虑继承。 –
用户[sequelize.js](http://docs.sequelizejs.com/en/v3/)ORM – SpunkyLive