是否可以从节点 js 中的同一模块导出构造函数和一些普通函数?

Is It possible to export constructor function and some normal function from same module in node js?

我的应用结构:

| my-application
| -- app.js
| -- node_modules
| -- public
| -- models
     | -- users.js
| -- routes
     | -- index.js
| -- views
     | -- index.ejs

users.js

function User(name){
   this.name = name;
}

User.prototype.getName = function () {
   return this.name;
};

exports.checkName = function (name) {
   if(name === 'johnSnow'){
      return true;
   }
   return false;
};

module.exports = User;

我试试这个:

index.js

var user  = require('../models/users');

if( user.checkName('dinar') === true ){
    var User = new user('name');
    console.log(User.getName());
}

TypeError: user.checkName is not a function

是否可以使用同一模块中的函数和构造函数?

有什么办法吗?

我是 node js 的新手。

提前致谢。

对于这种类型的实施,您通常会这样做:

user.js

function User(name){
    this.name = name;
}
User.prototype.getName = function () {
    return this.name;
};

module.exports = {
    User: User,
    checkName: function(name) {
        return (name === 'johnSnow');
    }
};

然后在index.js

var users  = require('../models/users');

if (users.checkName('dinar')) {
    var user = new users.User('name');
    console.log(user.getName());
}

是的,可以通过将普通函数作为 "static" 方法放在构造函数本身上。在您的尝试中,您用 User 覆盖了 exports 对象,因此 checkName 丢失了。相反,做

function User(name){
   this.name = name;
}

User.prototype.getName = function () {
   return this.name;
};

User.checkName = function (name) { /*
^^^^ */
   return name === 'johnSnow';
};

module.exports = User;

或者你可能想写

module.exports = User;
module.exports.checkName = function (name) {
   return name === 'johnSnow';
};

很有可能,我会这样做。对我来说,我总是把属于一个对象的函数写成嵌套函数,我发现它在概念上更容易,也更合乎逻辑。您会看到 addSquares 是一个辅助方法,它不属于由构造函数生成的 Square 对象。

文件A:

var exports = module.exports();
exports.Square = Square;
exports.addSquares = addSquares;

function Square(width, height){
   this.width = width;
   this.height = height;

   this.area = function(){
       return this.width * this.height;
   }
}

function addSquares(sq1, sq2){
   return sq1.getArea() + sq2.getArea();
}

文件B

var Square = require('fileA');

var mySquare = new Square.Square(10,50);
var yourSquare = new Square.Square(50,50);
var area2 = Square.addSquares(mySquare, yourSquare);