关于使用node-postgres和渲染页面在node js中回调的问题
Questions about callbacks in node js using node-postgres and render page
我的 postgresSql 有 table 个用户(username, password e administrator(boolean))
。一旦我进行查询 (SELECT * FROM users WHERE username= AND password=')
我想检查管理员是否等于 true,然后重定向到管理员页面,如果是 false 则重定向到 normalClient 页面。
我很难理解回调。第一个可以收到错误或结果,但如果我收到结果,我需要检查管理员是否 == true 然后重定向到管理页面,否则重定向到客户端页面
router.post('/login',(req,res,next)=> {
let text = 'SELECT * FROM users WHERE username= AND password=';
let values = [req.body.username,req.body.password];
//callback
//make query
pool.query(text, values, (err, res) => {
// if error print
if (err) {
console.log(err.stack)
//if receive result print
} else {
console.log(res.rows[0].administrator)
// { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
}
});
res.redirect('/adminDashboard');
});
我认为,您需要在 pool.query
函数的回调内部进行重定向。
关于您的具体问题,您需要将 res.redirect('/adminDashboard');
移到 else
块中。还阅读了以前的评论,我发现您在多个地方使用了 res
变量 - router.post('/login',(req,res,next)=> {
和 pool.query(text, values, (err, res) => {
。在任何地方调用 res
以外的值。
既然你提到你在理解回调方面有困难,这里稍微介绍一下。每当您在 Javascript 中执行一个函数时,您需要检查该函数是 运行 同步还是异步。如果是异步的,就像函数pool.query
,你需要提供一个回调——本质上是另一种方法,当从原始方法获取数据时需要运行。
当Javascript开始执行您的代码时,它会调用pool.query
方法,但不会等待结果!相反,它将去执行 res.redirect('/adminDashboard');
行代码。这就是为什么您需要在回调中移动此行的原因。
这就是 Javascript 的魅力所在。使用方法 运行 async 可以使您的整个程序更快,因为现在您的线程不会闲置。它不等待结果,而是去执行下一个操作。当您的原始方法完成并返回数据时,它将返回并执行回调函数。
更新
根据您的评论,如果您将池中的 res
重命名为 pool.query(text, values, (err, queryRes) => {
,您仍然可以在 else 块中执行 res.redirect('/adminDashboard');
,因为您仍然可以访问父 res
变量。
我的 postgresSql 有 table 个用户(username, password e administrator(boolean))
。一旦我进行查询 (SELECT * FROM users WHERE username= AND password=')
我想检查管理员是否等于 true,然后重定向到管理员页面,如果是 false 则重定向到 normalClient 页面。
我很难理解回调。第一个可以收到错误或结果,但如果我收到结果,我需要检查管理员是否 == true 然后重定向到管理页面,否则重定向到客户端页面
router.post('/login',(req,res,next)=> {
let text = 'SELECT * FROM users WHERE username= AND password=';
let values = [req.body.username,req.body.password];
//callback
//make query
pool.query(text, values, (err, res) => {
// if error print
if (err) {
console.log(err.stack)
//if receive result print
} else {
console.log(res.rows[0].administrator)
// { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
}
});
res.redirect('/adminDashboard');
});
我认为,您需要在 pool.query
函数的回调内部进行重定向。
关于您的具体问题,您需要将 res.redirect('/adminDashboard');
移到 else
块中。还阅读了以前的评论,我发现您在多个地方使用了 res
变量 - router.post('/login',(req,res,next)=> {
和 pool.query(text, values, (err, res) => {
。在任何地方调用 res
以外的值。
既然你提到你在理解回调方面有困难,这里稍微介绍一下。每当您在 Javascript 中执行一个函数时,您需要检查该函数是 运行 同步还是异步。如果是异步的,就像函数pool.query
,你需要提供一个回调——本质上是另一种方法,当从原始方法获取数据时需要运行。
当Javascript开始执行您的代码时,它会调用pool.query
方法,但不会等待结果!相反,它将去执行 res.redirect('/adminDashboard');
行代码。这就是为什么您需要在回调中移动此行的原因。
这就是 Javascript 的魅力所在。使用方法 运行 async 可以使您的整个程序更快,因为现在您的线程不会闲置。它不等待结果,而是去执行下一个操作。当您的原始方法完成并返回数据时,它将返回并执行回调函数。
更新
根据您的评论,如果您将池中的 res
重命名为 pool.query(text, values, (err, queryRes) => {
,您仍然可以在 else 块中执行 res.redirect('/adminDashboard');
,因为您仍然可以访问父 res
变量。