【问题标题】:KoaJS with Thunkify + Mongoose带有 Thunkify + Mongoose 的 KoaJS
【发布时间】:2014-11-28 13:09:49
【问题描述】:

我正在处理我的第一个 koajs 项目,并且在了解(或尝试)生成器函数、yield、thunk 等之后。我遇到了 mongoose 的问题(我非常依赖它)。搜索论坛后,解决方法是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)

...嗯。帮助? :)

【问题讨论】:

    标签: node.js mongodb coffeescript mongoose thunk


    【解决方案1】:

    修复它:)

    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。


    更新:无需将 thunkify 与 mongoose 一起使用。您可以只使用 exec 函数,因为它已经是一个 thunk 承诺,co 也可以使用(感谢 @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
    

    【讨论】:

    • 小修正:.exec() returns a Promiseco 也可以使用。不过很高兴你让它工作了:)
    • 太棒了 - 越来越接近理解所有生成器的魔法:D 谢谢@jmar777!
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2017-11-27
    • 2014-03-18
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2015-10-04
    相关资源
    最近更新 更多