gpt4 book ai didi

javascript - 我违背了我的 promise

转载 作者:IT老高 更新时间:2023-10-28 22:12:35 24 4
gpt4 key购买 nike

所以.. 我最难学习如何 promise 。

我正在使用 bluebird ( https://github.com/petkaantonov/bluebird ) 正如向我建议的那样——为了驯服我一直在得到的回调 hell 。示例:

function login(req,res,con,mysql,P) {
var ref = undefined;
con.getConnection(function(err,connection) {
if (err) console.log("Get Connection Error.. "+err);
con.query('SELECT password,id FROM player WHERE name='+mysql.escape(req.body.user),function(err,rows,fields) {
if (err) throw err;
if (!rows[0]) {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
if (rows[0].password !== "undefined") {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
}
});
connection.release();
});
console.log(ref);
return ref;
}

很恶心,到处都是回调,函数返回ref在查询回调完成执行之前。

解决方案: promise !

我尝试使用快速启动转换我的函数.. 所以我 promisefyAll我的 mysql创建连接之前的模块:

var mysql = require("mysql");
var Promise = require("bluebird");
Promise.promisifyAll(mysql);

我写的函数如下:

function login(req,res,con,mysql,P) {
var ref = undefined;
Promise.promisify(con.getConnection)().then(function(connection) { //updated line returns error no method promisify. Bluebird v. 1.1.1
con.query('SELECT password,id FROM player WHERE name='+mysql.escape(req.body.user)).then(function(rows,fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
});
return ref;
});
}

但我不断收到 TypeError: Cannot call method 'then' of undefined at Object.login (/var/www/post/posts.js:36:22)

还有

TypeError: undefined is not a function at Pool.<anonymous> (/var/www/node_modules/mysql/lib/Pool.js:53:14)

错误。有人可以帮我理解如何实现查询我的数据库的 promise (正确)吗?

编辑(接受回答后:):这是我调用登录功能的方式:

app.post("/login",function(req,res) {
Player = post.login(req,res,con,mysql,p);
console.log(Player); // logs [Object object]
}); //inside the login function, it logs the object like it should

最佳答案

当你 promise 一个原型(prototype)时, promise 返回的方法将有 *Async 后缀

promisification 的想法是假装图书馆的设计初衷就是要返回 promise。您不应在运行时在应用程序代码中调用 promisify,而应在应用程序引导初始化代码或类似代码中调用。

var mysql = require("mysql");
var Promise = require("bluebird");
//Only need to be called once per application so probably not here
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);

function login(req,res,con,mysql,P) {
return con.getConnectionAsync().then(function(connection) {
return connection.queryAsync('SELECT password,id FROM player WHERE name='+
mysql.escape(req.body.user)).spread(function(rows, fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
var ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
return ref;
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
}).finally(function() {
connection.release();
});
});
}

future 版本将有更好的资源管理,您将能够做到:

function login(req,res,con,mysql,P) {
return Promise.using(con.getConnectionAsync(), function(connection) {
return connection.queryAsync('SELECT password,id FROM player WHERE name='+
mysql.escape(req.body.user));
}).spread(function(rows, fields) {
if (hash.verify(req.body.pass,rows[0].password)) {
req.session.loggedIn = true;
req.session.user = rows[0].id;
var ref = new P(rows[0].id,con,req);
res.send({
"msg":"You have logged in!",
"flag":false,
"title":": Logged In"
});
return ref;
} else {
res.send({
"msg":"Your username and or password was incorrect.",
"flag":true,
"title":": Login Failed"
});
}
});
}

如何使用结果:

app.post("/login",function(req,res) {
post.login(req,res,con,mysql,p).then(function(Player) {

});
})

关于javascript - 我违背了我的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com