Node.js 异步瀑布挂起
Node.js Async Waterfall Hangs
我目前正在实施使用 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 查询。最后,它应该执行查询并将结果传递给回调函数。在这里,我的实现因挂起而失败,并且永远不会执行回调。我对代码片段中的行进行了注释,让大家更好地了解发生了什么。
有人能给我指出正确的方向吗?
您的主要问题是您的 query
方法签名需要接受回调作为最后一个参数。
query = (valid, callback) ->
对于waterfall
,第一个worker函数占用(callback)
,但其余的占用(previousResult, callback)
。
此外,考虑到您使用 query
方法的方式,它不需要 return 函数,就像您在做的那样。只需接受回调作为参数,并在准备好继续完成瀑布时调用它。
旁白: 在 coffeescript class 中对方法和局部变量使用 "query" 容易出错且令人困惑。为局部变量使用不同的名称,例如 "modelQuery".
我目前正在实施使用 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 查询。最后,它应该执行查询并将结果传递给回调函数。在这里,我的实现因挂起而失败,并且永远不会执行回调。我对代码片段中的行进行了注释,让大家更好地了解发生了什么。
有人能给我指出正确的方向吗?
您的主要问题是您的 query
方法签名需要接受回调作为最后一个参数。
query = (valid, callback) ->
对于waterfall
,第一个worker函数占用(callback)
,但其余的占用(previousResult, callback)
。
此外,考虑到您使用 query
方法的方式,它不需要 return 函数,就像您在做的那样。只需接受回调作为参数,并在准备好继续完成瀑布时调用它。
旁白: 在 coffeescript class 中对方法和局部变量使用 "query" 容易出错且令人困惑。为局部变量使用不同的名称,例如 "modelQuery".