Q.js 承诺与节点.`socket` 上缺少错误处理程序.类型错误:无法调用未定义的方法“then" [英] Q.js promise with node. Missing error handler on `socket`. TypeError: Cannot call method 'then' of undefined
本文介绍了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屋!
查看全文