与Thunkify +mongoose的KoaJS

我正在做我的第一个koajs项目,理解(或试图)发电机function,产量,thunk等。我遇到了一个与mongoose(我严重依赖)的问题。 search论坛后,解决scheme是thunkify:

CoffeeScript的:

Controller = require './basecontroller' User = require '../models/user' UserController = ((c, User) -> return ( get: (next) -> userQuery = c.libs.thunkify User.find try users = yield userQuery {} @body = users return catch e console.error "Error: #{e}" throw e return next() ) ) Controller, User # Export functionality module.exports = UserController 

JavaScript的:

 // Generated by CoffeeScript 1.8.0 var Controller, User, UserController; Controller = require('./basecontroller'); User = require('../models/user'); UserController = (function(c, User) { return { get: function*(next) { var e, userQuery, users; userQuery = c.libs.thunkify(User.find); try { users = (yield userQuery({})); this.body = users; return; } catch (_error) { e = _error; console.error("Error: " + e); throw e; return; } return next(); } }; })(Controller, User); module.exports = UserController; 

这在我的脑海中是有道理的…但是我收到这个错误:

 14:56:01 web.1 | Error: TypeError: Cannot read property 'discriminatorMapping' of undefined 14:56:01 web.1 | TypeError: Cannot read property 'discriminatorMapping' of undefined 14:56:01 web.1 | at find (/Users/mial/Projekte/MiPa/schuppen4-on-heroku/node_modules/mongoose/lib/model.js:940:18) 14:56:01 web.1 | at Object.<anonymous> (/Users/mial/Projekte/MiPa/schuppen4-on-heroku/node_modules/thunkify/index.js:43:12) 14:56:01 web.1 | at next (/Users/mial/Projekte/MiPa/schuppen4-on-heroku/node_modules/koa/node_modules/co/index.js:90:21) 14:56:01 web.1 | at Object.<anonymous> (/Users/mial/Projekte/MiPa/schuppen4-on-heroku/node_modules/koa/node_modules/co/index.js:45:5) 14:56:01 web.1 | at Server.<anonymous> (/Users/mial/Projekte/MiPa/schuppen4-on-heroku/node_modules/koa/lib/application.js:125:8) 14:56:01 web.1 | at Server.emit (events.js:110:17) 14:56:01 web.1 | at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:491:12) 14:56:01 web.1 | at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23) 14:56:01 web.1 | at Socket.socketOnData (_http_server.js:343:22) 14:56:01 web.1 | at Socket.emit (events.js:107:17) 

呃。 帮帮我? 🙂

修复 :)

 Controller = require './basecontroller' User = require '../models/user' UserController = ((c, User) -> User.find = c.libs.thunkify User.find return ( get: (next) -> try users = yield User.find {} @body = users catch e console.error "Error: #{e}" ) ) Controller, User # Export functionality module.exports = UserController 

显然我必须“覆盖”User.find函数,并在模块模式return语句之前定义thunkify。


更新 :不需要使用mongoosethunkify。 你可以使用exec函数,因为它已经是一个thunk的承诺,它也可以(谢谢@ jmar777):

 Controller = require './basecontroller' User = require '../models/user' UserController = ((c, u) -> return ( get: () -> try users = yield u.find({}).exec() @body = users catch e console.error e ) ) Controller, User module.exports = UserController