【问题标题】:how to create models in nodejs如何在nodejs中创建模型
【发布时间】:2022-01-06 14:40:46
【问题描述】:

我是一名 .net 开发人员,正在尝试 nodejs web api 开发。

我想知道我们是否可以像在 asp.net web api 中一样在 nodejs 中创建模型。

例如

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 包?

【问题讨论】:

  • 您是在问是否可以创建类并使用继承,还是在问您是否可以使用 mssql 来做到这一点?这是 2 个不同的问题,可能有不同的答案。
  • 如何在nodejs中创建模型,是的还要考虑继承。
  • 用户sequelize.js ORM

标签: node.js rest asp.net-web-api


【解决方案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 使用了一个被称为“鸭子类型”的概念(如果它看起来像鸭子并且听起来像鸭子,那么它就是鸭子)。由于 JavaScript 是弱类型的,它不关心对象是 BaseResponse 还是 MovieResponse,您可以调用任何方法或尝试访问您想要的任何字段。结果通常是错误或错误/容易出错的代码。我在这里提到这一点是因为您可能会遇到这个概念及其支持者。知道这样的编程是危险的,并且会导致不良的编程习惯。

【讨论】:

  • 我忘了提到有一些库向 JavaScript 添加了类似于 OOP 语言的语法。想到的两个是 TypeScript 和 CoffeeScript。我都没有这方面的经验,所以我不能说太多。
  • «不支持您从其他语言中了解的类和继承的概念»截至 2016 年,它存在于许多浏览器、Node.js 以及大多数(如果不是全部)转译器中(比如巴别塔)。它只是基于原型的“类”和继承的语法糖,但仍然如此。
  • 我不知道Node.js supported all ES6 standards related to classes。您是否有任何资料显示默认支持哪些 ES6 标准?另外,如果你需要支持 IE,it does not yet support classesAccording to Mozilla,Opera 也不支持类语法糖。
  • kangax.github.io/compat-table/es6 中有一个表格,它完全冻结了我的浏览器。除此之外,Node.js 官方页面和 V8 项目也可以使用。当然,浏览器是另一回事,这就是像 Babel 这样的编译器出现的地方。
猜你喜欢
  • 2019-04-09
  • 2016-03-06
  • 2016-06-23
  • 1970-01-01
  • 2015-07-14
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多