2017-05-12 10 views
1

私は変更しようとしていますfindTitleLatestRevはnode.jsでlambdaに機能します これはスキーマのメソッドを定義するためにmongooseで使用されます。前 :変更する前に、それがうまく機能しないnode.jsでラムダを使用しても動作しません

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 = function(title, callback){ 
    return 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 

) `

+0

findはどこに定義されていますか?あなたはクラス全体を貼り付けることができますか? findがmongooseメソッドなら、それはうまくいきません。 – kimy82

+0

'findTitleLatestRev'関数は、スキーマのメソッドを定義するためにmongooseモジュールで使用されます。 'find'はmongooseまたはmongoDBのメソッドです –

+0

ええ。しかし、ラムダを使用する場合、 'this'は静的スキーマではなく静的スキーマを定義したクラスになります。ラムダを使いたい場合は、 'this'を_this.revisionModel.find(... – kimy82

答えて

3

アロー機能が異なっ古い関数定義からthisを扱う:エラーが発生すること

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

:私はそれを変更します。

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

Until arrow functions, every new function defined its own this value [...]. An arrow function does not create its own this context, so this has its original meaning from the enclosing context.

基本的には、矢印の機能は、常にそれが定義されたコンテキストのthis値を持つことになります。別のコンテキストにリバウンドすることはできません。

クラスでは、従来の方法で関数によってthisが設定されているとみなされているため、矢印関数では機能しません。

クラスにアクセスできる場合は、矢印機能をサポートするためにthisがどのように使用されているかを処理するために、クラスに書き換えることができます。それ以外の場合は、従来の関数をそのまま使用する方がずっと簡単だと思います。

関連する問題