我正在尝试实现一个用例,其中用户可以通过提供用户名来请求检查其密码。问题:Node js后端应用程序在查询完成之前返回结果。我查看了解释javascript异步方面的文章。但是,我仍然不确定,如果在两者之间涉及休息电话,是否可以应用该解决方案。
高水平流量:
码:
前端:
function getPassword() {//Called by clicking button on ui
var username = 'testuser'; //hardcoding for simplicity
$.ajax({
url: urlWhereNodeJsAppIsHosted,
error: function(password) {
console.log('error' + JSON.stringify(password));
}, success: function(data) {
console.log('success' + JSON.stringify(password)); // Displaying on console for now
}
});
}
后端(Node js应用):
const express = require('express');
const request = require('request');
const mysql = require('mysql');
const app = express();
var connection = mysql.createConnection({
host: 'localhost',
port: '3306',
user: 'dbuser',
password: 'dbuserpassword',
database: 'dbname'
});
connection.connect(function(err) {
if (err) {console.log(err);}
});
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
next();
});
app.get('/verify', (req, res) => {
var username = req.query.username;
var password = 'noresult';
connection.query(
'SELECT * FROM userpassword where user=?, ${[username]}',
function(err, rows, fields) {
password = extractpasswordfromrows(rows);//iterate and get result
}
);
console.log(connection.threadId); //Value is not undefined
res.send(200, { success: password });
});
const PORT = process.env.PORT || 3001;
app.listen(PORT, () => console.log(`listening on ${PORT}`));
数据库:
userpassword(user, password) table with existing data.
我是javascript新手,也是异步思维。请帮助您的输入。谢谢。
该代码将password
成功回调发送到外部,而无需等待查询完成。尝试
app.get('/verify', (req, res) => {
var username = req.query.username;
var password = 'noresult';
connection.query(
'SELECT * FROM userpassword where user=?, ${[username]}',
function(err, rows, fields) {
password = extractpasswordfromrows(rows);//iterate and get result
res.send(200, { success: password }); // Ok, have password here
}
);
// Not Ok, don't have password here
console.log(connection.threadId); //Value is not undefined
});
我没有尝试放入校验代码来验证err
回调中的参数是否真实,即使从逻辑上看是不可能的。
有关针对此错误的编码的一般处理,请参见“如何从异步调用返回结果”。
在回调之外处理结果
为了避免嵌套代码,回调代码可以根据处理结果来解析或拒绝新创建的promise,使用promise的then/catch
方法将结果和错误处理功能附加到promise 。
另外,在Express中,您可以在需要时提供多个回调(中间件函数),app.get
并使用next
调用前进到下一个中间件函数。以帖子为例(已编译但未经测试):
app.get('/verify',
(req, res, next) => {
var username = req.query.username;
connection.query(
'SELECT * FROM userpassword where user=?, ${[username]}',
function(err, rows, fields) {
if( err) {
res.status(500).send("no result");
}
else {
res.locals.rows = rows;
next();
}
}
);
},
(req,res) => {
const password = extractpasswordfromrows(res.locals.rows); //iterate and get result
res.send(200, { success: password });
}
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句