Q.js 承诺与节点.`socket` 上缺少错误处理程序.类型错误:无法调用未定义的方法“then" [英] Q.js promise with node. Missing error handler on `socket`. TypeError: Cannot call method 'then' of undefined

查看:38
本文介绍了Q.js 承诺与节点.`socket` 上缺少错误处理程序.类型错误:无法调用未定义的方法“then"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 nodejs 和 promise 的新手,我用 npm 安装了 Q.js :

I´m rookie with nodejs and with promises, I installed Q.js with npm :

npm install q

当我向 postgres 查询时,我尝试着做出承诺,这是我的代码...

I´m try yo make a promise when I made a query to postgres, this is my code...

socket.on('Operation', function (data) {
....... 
getElementInPostgres(makeQuery)
    .then(function (name) {
          console.log("promiseeee then");
          .......blablabla
      })
    .fail(function (err) {
      console.log("promiseeee error");
    });
.............

function getElementInPostgres(makeQuery){
  console.log("entro getElementInPostgres");
  var deferred = Q.defer();
  client.query(
                  makeQuery,
                  function(err, result) {
                    if (err) {
                       console.log("NO getElementInPostgres");
                      console.log(err);
                      deferred.reject(err);
                    } else {
                       console.log("ok getElementInPostgres");
                     console.log(result);
                     deferred.resolve(result);
                    }
                    return deferred.promise;
                });
}

但是我的代码崩溃了

entro getElementInPostgres
Missing error handler on `socket`.
TypeError: Cannot call method 'then' of undefined
    at Socket.<anonymous> (/var/www/test.smartparking/nodejs/server.js:247:6)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.onevent (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/socket.js:335:8)
    at Socket.onpacket (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/socket.js:295:12)
    at Client.ondecoded (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/client.js:193:14)
    at Decoder.Emitter.emit (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20)
    at Decoder.add (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/socket.io-parser/index.js:247:12)
    at Client.ondata (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/client.js:175:18)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.onPacket (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/engine.io/lib/socket.js:101:14)

我正在查看示例,但在我的代码中没有看到任何不同......

I was looking at examples and do not see anything different in my code ...

谢谢!

推荐答案

参考 q.defer 示例,请尝试将 return deferred.promise; 移出 client.query 如下

Refer to q.defer example, please try to move return deferred.promise; out of client.query as below

function getElementInPostgres(makeQuery){
  console.log("entro getElementInPostgres");
  var deferred = Q.defer();
  client.query( makeQuery,
                  function(err, result) {
                    if (err) {
                       console.log("NO getElementInPostgres");
                      console.log(err);
                      deferred.reject(err);
                    } else {
                       console.log("ok getElementInPostgres");
                     console.log(result);
                     deferred.resolve(result);
                    }
                });
     return deferred.promise;
}

这篇关于Q.js 承诺与节点.`socket` 上缺少错误处理程序.类型错误:无法调用未定义的方法“then"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆