如何在快递应用程序中使用承诺?

Posted

技术标签:

【中文标题】如何在快递应用程序中使用承诺?【英文标题】:How to use promises inside express app? 【发布时间】:2013-11-29 23:17:25 【问题描述】:

我正在尝试在 app.get 函数中使用一个 Promise,该函数将运行一个查询,该查询将在一个 Promise 上运行。但问题是响应不等待承诺,而只是响应。

知道代码应该如何让promise 存在于app.get 中吗?

【问题讨论】:

你能告诉我们你正在使用的代码吗?没有它,我们无法为您提供准确的答案。 如果您愿意使用尚未从 Express 的关注中受益,但明确为 Promise 设计的东西,您可以考虑研究:HTTP Apps with Q-IO github.com/kriskowal/q-io, Q-IO 上的薄层称为 Joey github.com/montagejs/joey 或 Bogart github.com/nrstott/bogart,所有这些都使用 Q 并且基于 CommonJS/JSGI + promises + promise 流。 谢谢大家,看来这些承诺确实适用于 vanilla express,但不适用于 parse.com 上运行的版本......所以我所做的是将逻辑移出 parse.com 云代码和进入 Windows azure 实例。从长远来看,我认为这对我们来说比转发他们的发行版更好 【参考方案1】:
app.get('/test', function (req, res) 
    db.getData()
    .then(function (data) 
        res.setHeader('Content-Type', 'text/plain');
        res.end(data);
    )
    .catch(function (e) 
        res.status(500, 
            error: e
        );
    );
);

【讨论】:

你是否也将连接调用包装在一个承诺中......即,db.connectAsync(stuff;).then(function (dbh) app.get('/test', ...) ); 如果您在数据库连接承诺中拥有所有应用程序处理程序,该承诺会返回任何内容吗?【参考方案2】:

这是Express documentation的回答:

app.get('/', function (req, res, next) 
  // do some sync stuff
  queryDb()
  .then(function (data) 
    // handle data
    return makeCsv(data)
  )
  .then(function (csv) 
    // handle csv
  )
  .catch(next)
)

app.use(function (err, req, res, next) 
  // handle error
)

值得注意的主要是通过.catch()传递next,这样一个通用的错误处理路由可以将错误处理逻辑封装到下游。

【讨论】:

以上是关于如何在快递应用程序中使用承诺?的主要内容,如果未能解决你的问题,请参考以下文章

处理快递申请中未处理的承诺拒绝

如何在电子应用程序中打包快递服务器?

在 Chrome 扩展程序中,如何确保在使用 chrome-promise 的下一个承诺之前解决上一个承诺?

如何撤销承诺?

如何从快递控制反应路由器

如何在电子中运行快递?