
如图,我用的express框架,写的一个路由,把
app.get("/loginForm?**", function (req, res) {
pool.getConnection(function (err) {
if (err) { }
else {
connection.query("USE userInfo", function (err, rows) {
//业务逻辑
});
}
});
});
改写为step模式,即使用中间函数传递值,也没法把req和res传递到最内层connection.query的回调函数里,但是这里业务逻辑会用到res.send()向前端传数据,所以问题来了,怎么跨层传递这个res呢?
有人说直接用就行,我改写了代码如下
step(
function appGet() {
app.get("/loginForm?**", this);
},
function poolGet(err, req, res) {
pool.getConnection(this);
},
function poolUse(err, connection, req, res) {
console.log(p);
if (err) {
console.log(err + "--from connection");
res.send("登录失败,数据库连接错误");
} else {
var queryString = "USE userInfo;";
connection.query(queryString, this);
}
},
function poolSelect(err, rows) {
if (err) {
console.log(err);
} else {
var selectQuery = "SELECT * FROM users WHERE userName=" + "'" + req.query.username + "'";
connection.query(selectQuery, this);
}
},
function poolRows(err, rows) {
if (err) {
console.log(err + "--from queryString");
res.send("登录失败,数据库查询错误");
} else {
if (rows.length == 0) {
res.send("登录失败,用户不存在");
} else {
if (req.query.password == rows[0].password) {
res.cookie("username", req.query.username, {
expires: new Date(Date.now() + 900000)
});
res.send("登录成功");
} else {
res.send("登录失败,密码不正确");
}
}
}
});
select那层调用connection,还有最内层调用res,req都是undifined
我之前写return是因为this无法传递值,试试return行不行
根据大神的指点,我试了下parallel形式,代码如下
step( function appGet(){
app.get("/loginForm?**",this.parallel());
pool.getConnection(this.parallel());
},
function poolUse(req,res,connection,err){
if (err){
console.log(err+"--from connection");
res.send("登录失败,数据库连接错误");
}else{
var queryString = "USE userInfo";
connection.query(queryString,function(err,rows){
if (err) {
console.log(err);
} else{
res.send(rows);
}
});
}
}
);
服务器可以返回数据,然而,如你所见,内层的connection.query就只能写成回调风格了,因为如果你写成this或者别的什么,app.get的res和req就传进去了
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
从第2段代码来看,是有很多变量不存在于当前作用域,看图上的波浪线
我看了 Step 的说明,有这么一段
注意,后面传入的参数是
this.parallel(),这个函数调用返回的应该是一个函数,因为fs.readFile(filename, callback)。在没传入
this.parallel()的情况下,返回值,只有 1 个,是作为参数传递给下一个函数的,像你这种情况不能写 n 个 return,因为只有第 1 个起作用,后面的不会执行。你应该这样写但这里有个问题,
app.get的callback是在内部的函数中定义的,其参数不可能return出来。如果用this.parallel(),又不知道它能不能处理多个参数的情况。可能得你自己试试了。做了个试验,总算知道咋个用 group 来处理多个参数的情况了
你的代码大概应该是下面这个样子,试试
终了
想了下,可以用类似 group() 的办法来用 parallel(),反正参数都是自己传的,不用搞那么复杂
你的代码应该是改成这样(没调试,你自己试试)
时隔半年,回头看自己的代码真是too young,一个promise可以解决的问题