在node.js上使用lambda不起作用

时间:2017-05-12 07:07:08

标签: javascript lambda this

我正在尝试将 findTitleLatestRev 函数更改为node.js中的lambda。 这用于 mongoose 来定义模式的方法。 之前:

RevisionSchema.statics.findTitleLatestRev = function(title, callback){
    return this.find({'title':title})
        .sort({'timestamp':-1})
        .limit(1)
        .exec(callback);
};

请致电:

module.exports.getLatest=function(req,res){
    let title = req.query.title;
    Revision.findTitleLatestRev(title, (err,result)=>{
         if (err) console.log('Cannot find ' + title + "'s latest revision!");
         console.log(result);
         revision = result[0];
         res.render('revision.pug',{title: title, revision:revision});
    });
};

在改变之前,它确实运作良好。我将其更改为:

`RevisionSchema.statics.findTitleLatestRev = (title, callback)=>
    {this.find({'title':title})
        .sort({'timestamp':-1})
        .limit(1).
        exec(callback)};`

导致错误:

`TypeError: this.find is not a function
    at Function.RevisionSchema.statics.findTitleLatestRev (/home/tung/Documents/node/nodejs-labs/app/models/revision.js:25:8)
    at module.exports.getLatest (/home/tung/Documents/node/nodejs-labs/app/controllers/revision.server.controller.js:24:14)
    at Layer.handle [as handle_request] (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/layer.js:95:5)
    at /home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:335:12)
    at next (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:275:10)
    at Function.handle (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:174:3)
    at router (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:47:12)
    at Layer.handle [as handle_request] (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:317:13)
    at /home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:335:12)
    at next (/home/tung/Documents/node/nodejs-labs/node_modules/express/lib/router/index.js:275:10

)`

1 个答案:

答案 0 :(得分:3)

箭头函数以不同于旧函数定义的方式处理this

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

  

在箭头函数之前,每个新函数都定义了自己的这个值[...]。箭头函数不会创建自己的这个上下文,因此它具有封闭上下文的原始含义。

基本上,箭头函数将始终具有定义它的上下文的this值。它不能反弹到另一个背景。

该类假定函数以常规方式设置this,因此它不适用于箭头函数。

如果您有权访问该类,则可以重写它以处理this如何用于支持箭头功能。否则,我认为继续使用传统功能会更简单。