【问题标题】:Node.js Async Waterfall HangsNode.js 异步瀑布挂起
【发布时间】:2015-04-28 08:08:32
【问题描述】:

我目前正在实现一个使用 Express.js 构建的 API,遵循我的设计的 MVCS 模式。在阅读了 Async 模块之后,我得出的结论是,利用它强大的方法对我来说是个好主意。不幸的是,我遇到了一个我似乎无法解决的问题,并且想知道是否有人可以给我一些建议。我们来看代码:

'use strict'

_ = require 'lodash'
async = require 'async'
validator = require 'express-validator'

class BaseService

  constructor: (@model, @relationships, @fields) ->

  list: (req, callback) ->
    async.waterfall [
      validate(req).bind(this),
      query.bind(this)
    ], callback

  validate = (request) ->
    valid = request
    
    (next) ->
      next null, valid
      return

  query = (valid) ->
    query = @model.find({})

    if valid.query.q
      query = query.where(valid.query.q)

    if valid.query.sort
      query = query.sort(valid.query.sort)

    if valid.query.select
      query = query.select(valid.query.select)

    # Requests hangs at this point. Any ideas why?
    (next) ->
      query.exec next
      return

module.exports = BaseService

基本上,我想首先验证随请求传递的查询字符串。然后,根据验证对象中是否存在某些字段来构建 Mongoose 查询。最后,它应该执行查询并将结果传递给回调函数。在这里,我的实现挂起失败,并且永远不会执行回调。我在代码 sn-p 中注释了这行代码,以便大家更好地了解发生了什么。

有人可以指点我正确的方向吗?

【问题讨论】:

  • 你应该使用get方法来授权..

标签: node.js express coffeescript async.js


【解决方案1】:

您的主要问题是您的 query 方法签名需要接受回调作为最后一个参数。

query = (valid, callback) ->

对于waterfall,第一个工作函数采用(callback),但其余的采用(previousResult, callback)

另外,考虑到您使用query 方法的方式,它不需要像您那样返回函数。只需接受回调作为参数,并在准备继续完成瀑布时调用它。

旁白:在coffeescript 类中同时对方法和局部变量使用“查询”容易出错且令人困惑。为局部变量使用不同的名称,例如“modelQuery”。

【讨论】:

  • 谢谢你,彼得!就是这样。我想,我不太明白waterfall 是如何工作的,但现在很清楚了。祝您有美好的一天,先生。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2018-11-13
  • 2020-09-06
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多