Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Mysql和node.js进行同步数据库查询?_Javascript_Node.js_Es6 Promise - Fatal编程技术网

Javascript 如何使用Mysql和node.js进行同步数据库查询?

Javascript 如何使用Mysql和node.js进行同步数据库查询?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我正在尝试使用mysql nodejs模块在数据库中进行SELECT查询。问题在于,connection.query函数是一个异步函数,因此我将其放在如下承诺中: function execQuery(query, fields){ const connection = mysql.createConnection({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: p

我正在尝试使用mysql nodejs模块在数据库中进行SELECT查询。问题在于,
connection.query
函数是一个异步函数,因此我将其放在如下承诺中:

function execQuery(query, fields){
    const connection = mysql.createConnection({
        host: process.env.DB_HOST,
        port: process.env.DB_PORT,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_DATABASE,
    });

    return new Promise((resolve, reject) => {
        connection.query(query, fields, (err, results) => {
            connection.end();
            if (err){
                return reject(err);
            }else{
                return resolve(results);
            }
        }
    ) 
此函数由另一个函数调用:

function getPasswordFromUser(username){
    query = 'SELECT password FROM User WHERE username=?'
    parameters = [username]

    execQuery(query, parameters)
        .then(result => {
            if (result !== undefined && result.length === 1){
                console.log('here1')
                return result
            }
        })
        .catch(err => console.log(err))

    console.log('here2')
}
问题是,尽管我返回了一个承诺并使用
然后
,但在我的控制台中,我收到:

此处2
此处1
所以我的查询一直在异步模式下运行,无法得到结果


使用promise实现这一点的最佳方法是什么?

您首先看到这里的
2
,因为它不在
中,然后是
。程序在启动
execQuery
功能后继续执行

您可以返回一个承诺:

function getPasswordFromUser(username){
    query = 'SELECT password FROM User WHERE username=?'
    parameters = [username]

    return execQuery(query, parameters)
        .then(result => {
            if (result !== undefined && result.length === 1){
                console.log('here1')
                return result
            }
        })
        .catch(err => console.log(err))
}

然后将
.Then(result=>{…})
添加到函数调用中以获得结果。

只是您没有返回承诺,就是这样

做:
返回execQuery(查询,参数)

你把它当作一个简单的承诺

getPasswordFromUser('userid')
.then((result)=>{
  ..do stuff..
});
或者,如果您正在使用
async wait
则使用异步函数并等待
getPasswordFromUser
函数。例如,对于快速路线

app.post('/getPassword', async (req,res) =>{
    const userID = req.body.userID;
    const password = await getPasswordFromUser(userID);
    res.send(password);
});

注意:这条路线是一个笑话,我希望你不是以明文形式存储密码,如果你想匹配密码(比如登录),你应该这样做:
select count(*)from user,其中username=username,password=hash(password)
或者您正在使用
bcrypt
或其他方法匹配密码

如果您这样做是正确的,那么我要做的额外工作是
返回execQuery(..
以便调用
getPasswordFromUser的任何人(
也可以附加到承诺链。承诺仍然是异步的,使用承诺不会使任何事情同步。如果您希望
此处2
稍后出现,则需要将其放入
中,然后
回调。
getPasswordFromUser
也需要返回承诺。我尝试了此解决方案,但现在在调用getPasswordFromUser()的函数我收到一个承诺。我只想返回查询的结果获取该值的唯一方法是添加一个
。然后(result=>{…})
getPasswordFromUser
函数调用。这正是Promissions/async的工作方式。因此我不能在“.then”语句之外使用结果。如果我想在另一个函数中使用此结果怎么办?我必须在“.then”中调用函数吗?如果我需要多次处理此变量,这可能是一个可怕的代码。这是异步函数工作,如果你想使用一个异步函数,你需要异步构造所有代码。但这就是为什么有
async wait
。它给你的印象是这是同步的,但在幕后它使函数异步。如果你想多次处理变量,只需存储它在局部变量中。