【问题标题】:Express promise doesn't work明示承诺不起作用
【发布时间】:2015-04-19 21:07:45
【问题描述】:

我对 Promise 很陌生,我认为我没有正确理解它,因为我在我的代码中尝试它没有成功。

我在 NodeJS 上有一个服务器,使用 Express 库和 express-promise

var express = require('express');
var app = express();
app.use(require('express-promise')());

然后我正在处理 ajax 查询:

var promise = function() {
    for(var query in req.query ){
        console.log( 'query: ', query );
        switch( query ){
           case 'getobserved':
             results.observedTags = getObserved();
             break; 
           ...
        }
    }
};

getObserved 正在从 Firebase DB 获取数据

var getObserved = function() {
    var observedTags = dbRef.child('observedTags');
    observedTags.on('value', function(snap) {
        var allObservedItems = snap.val();
        var list = [];
        for(var ii in allObservedItems ){
            list.push( allObservedItems[ii].name );
        }
        return list;
    });
};

最后我尝试通过以下方式向客户发送响应:

promise.then( res.send( results ), someRejectedMethod );

然后我进入控制台:

TypeError: undefined is not a function
at d:\wamp\www\soz2\server.js:100:13

可能方法“promise”是未定义的。我不确定我是否使用了 express-promise 错误,或者只是我对整个承诺缺乏了解。需要一些提示,请

【问题讨论】:

  • 您将promise 定义为一个普通的匿名函数。仅仅因为您将其命名为promise,它就不是一个承诺。因此,then 属性未定义。
  • 好的我明白了,但是你能给我提示一下吗,我该怎么办?
  • 抱歉,我不清楚您要做什么。
  • 在我的函数“promise”完成时尝试向用户发送响应;
  • 你不需要承诺。在函数结束时,只需调用 res.send()。如果你有简单的逻辑并且想在函数结束时做一些事情,那么 Promise 对你没有任何帮助。

标签: javascript node.js express promise


【解决方案1】:

可能方法“promise”未定义。

不,promise 函数似乎已定义。只是它是一个函数,不是一个promise对象,并且没有.then方法。

我不确定我是否使用了 express-promise 错误

是的。根据我对their docs 的理解,它似乎所做的只是让res.sendres.jsonres.render 接受承诺或包含承诺的对象,然后递归扩展和等待。

或者只是我对整个承诺缺乏了解。

同样如此。我推荐 general promise resources 作为了解 Promise 的切入点。

首先,您必须 promisify 您的 Firebase 方法,以便 getObserved 确实返回一个承诺。 (目前,它似乎失败了,因为您尝试return from an async callback)。如果您还没有使用 promise 库,您可能必须选择一个。

然后,在您的路线中,您可以像这样使用它

for (var query in req.query) {
    console.log('query: ', query);
    switch(query) {
        case 'getobserved':
            results.observedTags = getObserved(); // a promise
            break; 
         …
    }
}
res.json( result ); // here, express-promise does some magic

不需要var promise = function() { 行。你也可以废弃promise.then( res.send( results ), someRejectedMethod );,因为 express-promise 会为你处理这个问题。如果你不使用它,你可以用类似的东西明确地完成它

var promise = getObserved();
promise.then(function(list) {
    res.json({observedTags: list});
}, someRejectedMethod);

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2016-06-07
    • 2016-06-16
    • 2016-05-07
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多