模块化nodejs中文件之间的函数

Modularize functions between files in nodejs

本文关键字:函数 之间 文件 nodejs 中文 模块化      更新时间:2023-11-13

我很怀念在nodejs中理解这个概念。我想在的文件夹中放置一个函数/models/user表示我为用户使用的模型。然后我想在其他地方使用这些函数。我经常遇到的问题是,当做一些像user.something这样的事情时,它不像函数那样处理。我误解了这是怎么回事。

模型看起来像这样:

//model/user.js
function User() {
    this.foo = null;
}
User.prototype.hashPass = function (password, callback) {
    //Code that hashes a password
    callback(err, hash);
};
User.prototype.insertUser = function (email, password, callback) {
    //Code that inserts a user and returns some 'done' callback
    callback(err, done);
};
module.exports = User;

在我的程序中的其他地方,比如passport.js,我想这样做:

//config/passport.js
var User = require('../models/user);
var user = new User();
async.waterfall([
    //how does this look
    //EDIT ATTEMPTED HERE
    user.hashPass(password, function(err, result) {
    }),
    user.insertUser(result, function(err, rows) {
    })
], //some callback );

做了一些编辑,以帮助澄清我在这里试图实现的目标。

编辑:此链接显示如何使用多个回调进行异步瀑布

基于EDIT/理解的代码:

async.series([
  function(callback) {
    user.hashPass(password, function(err, result) {
      callback(err,result);
    })
  }
], function(err, result) {
  if (err) return err;
  console.log('test',result);
});

它不起作用,因为您必须在要使用它的文件中"要求"您的模块,并且您正在不存在的构造函数上创建对象方法。相反,您可以创建一个用户对象(而不是构造函数),并将每个函数设置为对象属性,如下所示:

//module file
var user = {
  hashPass: function(password, callback){
   //password-hashing function 
  },
  insertUser: function(email, password, callback){
  //new user function
  }
};
module.exports = user;

然后,在任何你想使用它的地方,你都可以这样做:

//some other file
var user = require(path-to-module);
user.hashPass(); //pass in all parameters (password, callback)
user.insertUser(); //pass in all parameters (password, callback)

该方法唯一可能的问题是,在调用任一对象属性之前,必须定义所有参数。

代码中唯一需要更改的就是替换行

module.exports = User;

通过在您的passport.js文件中

var User = require('../model/User');

然后您可以调用用户上的函数:

user.hashPass(password, function(err, result) {
    user.insertUser(result, function(err, rows) {
      // do something with rows here
    });
});

当我们一直需要自定义模块时,我们会按路径要求它们。

var User = require('config/passport');
var user = new User();
async.waterfall([
   //how does this look
   //do hashPass here
  ,
  //do insertPass here
], //some callback );