And*_*dré 8 node.js node-async
我是后端的Node.Js和JavaScript Web开发的新手.我看到回调内部的回调可能很痛苦,并且有模块可以避免这种情况.其中一个模块是async,https://github.com/caolan/async
我已经阅读了文档,但很难开始并理解如何做到这一点.
例如,我有这个函数"check_aut_user",如何使用async转换此代码?
function check_auth_user(username, password, done) {
var client = new pg.Client("pg://user:pass@127.0.0.1/database");
client.connect(function(err) {
// If not get the connection
if(err) { return console.error('could not connect to postgres', err); }
// Query the user table
client.query('select * from "user" where username = $1 and password = $2', [username, password], function(err, result) {
if(err) { return console.error('error running query', err); }
if (result.rowCount > 0) {
var res = result.rows[0];
console.log(res);
passport.serializeUser(function(res, done) {
//console.log("serializer: " + res);
done(null, res);
});
passport.deserializeUser(function(user, done) {
//console.log("deserializer: " + user['password']);
done(null, res);
});
return done(null, res);
} else {
return done(null, false);
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
最好的祝福,
以下是修改为在需要时使用异步的代码。
function check_auth_user(username, password) {
var client = new pg.Client("pg://user:pass@127.0.0.1/database");
async.waterfall([
client.connect,
function(callback) {
client.query('select * from "user" where username = $1 and password = $2', [username, password], callback);
},
function(result, callback) {
if(result.rowCount > 0) {
var res = result.rows[0];
async.series([
function(callback) {
passport.serializeUser(res, function(res, done) {
callback(null, res);
}
},
function(res, callback){
if(res) {
passport.deserializeUser(res, function(res, done) {
callback(null, res);
});
} else {
callback(new Error('SerializeUser failed'));
}
}
], function(err, res) {
if(err) {
callback(err);
} else {
callback(null);
}
});
}
else {
callback(new Error("No result"));
}
}
], function(err, result) {
if(err)
console.err(err);
});
}
Run Code Online (Sandbox Code Playgroud)
显然,它并没有使代码更具可读性。我建议进行额外的更改:
这两个方法都需要回调。这是一个重写:
// Given a client, queries for user
function retrieveUser( client, username, password, cb) {
client.query('select * from "user" where username = $1 and password = $2', [username, password], function(err, users){
if(err) {
cb(err);
}
else if(users.rowCount < 0) {
cb(new Error("No user found for username ="+username));
}
else {
cb(null, result.rows[0]);
});
}
//Uses passport to serialize/deserializeUser
function passportSerialize(user, cb){
async.series([
function(callback) {
passport.serializeUser(user, function(res, done) {
callback(null, res);
}
},
function(res, callback){
if(res) {
passport.deserializeUser(res, function(res, done) {
if(res) {
callback(null, res);
} else {
callback(new Error('deserializeUser failed'));
}
});
} else {
callback(new Error('SerializeUser failed'));
}
}
], cb);
}
Run Code Online (Sandbox Code Playgroud)
因此,我们的主要方法现在变成:
function check_auth_user(username, password) {
var client = new pg.Client("pg://user:pass@127.0.0.1/database");
async.waterfall([
client.connect,
function(callback) {
retrieveUser(client, username, password, callback);
},
function(user, callback) {
passportSerialize(user, callback);
}
], function(err, result) {
if(err)
console.err(err);
else
console.log("User authenticated, let her in");
});
}
Run Code Online (Sandbox Code Playgroud)
我希望您能看到这有多好。
| 归档时间: |
|
| 查看次数: |
4925 次 |
| 最近记录: |