【问题标题】:Node.js & MySQL - Queries not returning the resultNode.js & MySQL - 查询不返回结果
【发布时间】:2021-09-27 20:25:38
【问题描述】:

我正在使用 Node.js 并将其连接到 MySQL。

我的问题是,SELECT 查询没有返回结果。我使用了INSERT 查询,它运行良好!

对于SELECT的查询问题。

我想要一个单独的文件,其中包含对 MySQL 数据库执行查询的函数。该文件是 database.js,其中包含以下代码:

exports.connectionParams = {
    host: 'localhost',
    user: 'root',
    password: '*****',
    database: 'savitri_dev'
}

exports.getSchoolIdByName = (con, schoolName, callback) => {
    let sql = `SELECT id FROM School WHERE designation = '${schoolName}';`;
    console.log(sql);
    con.query(sql, (queryErr, result) => {
        if (queryErr) throw queryErr;
        callback(result[0].id);
        //return result[0].id;
    });
};

现在,我调用查询的文件是 new_client.js(它是一个路由文件):

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var db = require('../bin/database');

router.get('/', (req, res, next) => {
    //res.send('respond with a resource');
    res.render('new_client', { 
        title: 'Clients - Add New Client',
        angular_app_name: 'clientsModule',
        angular_controller_name: 'AddClientController'
    });
});

router.put('/', (req, res, next) => {
    const dbConnection = mysql.createConnection(db.connectionParams);
    let data = req.body;
    let studentsDataList = [];
    console.log(data.studentsData);
    [...data.studentsData].forEach((s) => {
        const schoolId = db.getSchoolIdByName(dbConnection, s.school, function(result) {
            console.log(result);
            console.log((result != null || result != undefined));
            return parseInt(result);
        });

        console.log(schoolId);
        
        studentsDataList.push([
            s.name,
            s.year,
            schoolId,
            s.course,
            s.mainVoucherCode,
            s.megaIdentifier
        ]);

        
    });
    console.log(studentsDataList);
});

module.exports = router;

我不明白问题是什么。此代码运行时没有错误,并作为输出:

[
  {
    name: 'M David',
    year: '3',
    school: 'Escola EB1,2,3/JI Quinta Nova da Telha',
    course: '',
    mainVoucherCode: '',
    megaIdentifier: ''
  }
]
SELECT id FROM School WHERE designation = 'Escola EB1,2,3/JI Quinta Nova da Telha';
undefined
[ [ 'M David', '3', undefined, '', '', '' ] ]
null
false

如您所见,我想做的是,对于列表中的每个元素,我想从数据库中获取 id 并将其添加到新列表中。

我已经尝试了很多不同的想法。

我已经尝试使用 async|await 函数和 Promisedatabase.js

(...)
exports.getSchoolIdByName_new = (con, schoolName) => {
    return new Promise((resolve, reject) => {
        con.query(`SELECT id FROM School WHERE designation = '${schoolName}';`, (queryErr, result) => {
            return queryErr ? reject(err) : resolve(result[0].id);
        });
    });
};
(...)

new_client.js

(...)
[...data.studentsData].forEach((s) => {
        (async () => {
            dbConnection.connect();
            const schoolId = await db.getSchoolIdByName(dbConnection, s.school);
            console.log(schoolId);
            dbConnection.end();
        });

        console.log(schoolId);
        
        studentsDataList.push([
            s.name,
            s.year,
            schoolId,
            s.course,
            s.mainVoucherCode,
            s.megaIdentifier
        ]);

        
    });
    console.log(studentsDataList);
(...)

输出

[
  {
    name: 'M David',
    year: '9',
    school: 'Escola EB2,3 D. João I',
    course: '',
    mainVoucherCode: '',
    megaIdentifier: ''
  }
]
PUT /clients-add-client 500 172.545 ms - 11532

我也尝试不使用来自另一个文件的查询 - 即,在 new_client.jsforEach 中使用它: new_client.js

(...)
[...data.studentsData].forEach((s) => {
        dbConnection.query(`SELECT id FROM School WHERE designation = '${s.school}';`, (queryErr, result) => {
            if (queryErr) throw queryErr;
            const schoolId = result[0].id;
        });

        console.log(schoolId);
        
        studentsDataList.push([
            s.name,
            s.year,
            schoolId,
            s.course,
            s.mainVoucherCode,
            s.megaIdentifier
        ]);

        
    });
    console.log(studentsDataList);
(...)

这给了我相同的500 输出:PUT /clients-add-client 500 172.545 ms - 11532

我不知道接下来该尝试什么。

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    如果您在循环中使用 await,请像这样使用它:

    dbConnection.connect();
    await Promise.all([...data.studentsData].map(async(s) => {            
        const schoolId = await db.getSchoolIdByName(dbConnection, s.school);
        console.log(schoolId);  
            
        studentsDataList.push([
           s.name,
           s.year,
           schoolId,
           s.course,
           s.mainVoucherCode,
           s.megaIdentifier
        ]);
        return s
    }));
    
    dbConnection.end();
    console.log(studentsDataList);
    

    【讨论】:

    • 对于await|async 调用函数,这很好用,谢谢!
    【解决方案2】:

    我还没有在项目中使用我的续集,你能解释一下

    1. 为什么在getSchoolIdByName的回调中使用null作为第一个参数

    2. 在 new_client.js 中,当您使用 db.getSchoolIdByName() 时,在第三个参数(结果回调)中,您只使用了一个为空的参数,正如我在第一点中提到的那样

    【讨论】:

    • 这不是一个真正的答案...发表评论或标记问题,因此它变得更加详细。
    • 这是我写问题时的一个错误,我会编辑。当我在回调函数中使用2个参数时是另一种尝试,类似于只是回调(结果)。
    猜你喜欢
    • 2013-08-24
    • 2012-07-26
    • 1970-01-01
    • 2023-02-09
    • 2018-03-06
    • 2019-11-20
    • 2021-11-27
    • 2015-01-29
    相关资源
    最近更新 更多