[英]Missing error handler on 'socket'. and typeerror: cannot read property 'on' of undefined
[英]Q.js promise with node. Missing error handler on `socket`. TypeError: Cannot call method 'then' of undefined
我是使用Node.js和Promise的新手,我使用npm安装了Q.js
:
npm install q
当我向postgres查询时,我想向您保证,这是我的代码...
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)
我在看示例,在我的代码中看不到任何不同...
谢谢 !
请参考q.defer
示例 ,请尝试将return deferred.promise;
从client.query
出来如下
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;
}
您只需要在client.query之外返回promise。
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;
}
client.query是一个异步方法....所以当您调用
getElementInProgress(makeQuery).then(...);
.then()将在client.query返回之前被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.