将回调传递给其他文件中的功能

时间:2016-06-26 07:21:35

标签: node.js mongoose

我在MEAN-stack项目上工作,在服务器上的模型中我使用以下mongoose hook:

File:  user.server.controller.js

exports.preSave = function(next) {
  this.wasNew = this.isNew;
  console.log('I got called from another file..')
  next();
}
.....

现在我正在导出上面的文件,并在我创建用户模型的文件中要求它。

 File: user.server.model.js

var theFile = require('Path to the file above')
var mongoose = require('mongoose');
var Schema = mongoose.Schema;


var userSchema = new Schema({
  name: String,
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  admin: Boolean,

});
var User = mongoose.model('User', userSchema);

//Here i can use the "hook":
userSchema.pre('save', theFile.preSave) 


module.exports = User;

以上代码有效,并且会记录我从另一个文件中调用过的。

现在,我需要做的是在这个功能中执行一些额外的工作:

 userSchema.pre('save', theFile.preSave) 

我的第一次尝试看起来像这样:

userSchema.pre('save', function(){
 console.log('I am the extra work')
 theFile.preSave
})

这会导致中间件出错:

Throw new Error('You pre must have a next argument --e.g., function (next ...)')

我认为我可能缺乏关于以正确方式将函数作为参数传递的知识。这可能是我应该以某种方式使用apply()或bind()这样的情况吗?

帮助表示感谢。谢谢!

1 个答案:

答案 0 :(得分:1)

这只是意味着,你没有按照Mongoose的要求将next()回调传递给.pre()中间件函数。

Docs

userSchema.pre('save', function(next){
 console.log('I am the extra work')
 theFile.preSave()
 next()
})

next()是必要的,所以mongoose知道中间件什么时候完成它的事情并跳转到下一行。

由于你的preSave()函数已经调用next()作为参数传递,你只需要像这样传递next()

userSchema.pre('save', function(next){
 console.log('I am the extra work')
 theFile.preSave(next)
})