Невозможно получить значение из функции Javascript / Node. JS - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь вставить имя пользователя пользователя, а затем пытаюсь вставить его user_id (который автоматически увеличивается в таблице MySQL) в таблицу Party, как видно из кода ниже. Всякий раз, когда я консоль регистрирую результаты из selectUserID, я получаю user_id без каких-либо проблем.

Всякий раз, когда я пытаюсь поместить user_id в функцию insertPokemon, он не будет работать вообще. Если я жестко кодирую значение, оно, очевидно, работает, но если я использую это, get_id всегда будет пытаться ввести «неопределенное» значение и вообще не допустит вставки. У меня нет никаких проблем при вставке только имени пользователя с помощью функции insertUser. Кто-нибудь знает, как я могу передать selectUserID results / user_id в функцию insertPokemon? Я также попытался передать результаты в переменную безуспешно.

Дополнительное примечание: Когда я console.log (results) возвращает правильное целое число, которое мне нужно, но когда я на самом деле возвращаю результаты, оно всегда неопределен.

require('dotenv').config();

const bodyParser = require('body-parser');
const express = require('express');
const connection = require('./db');
const path = require(`path`);

const app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.listen(8081, () => {
    console.log(`Server running on port 8081`);
});

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, '/views/form.html'));
});

app.post('/submit', async (req, res, next) => {

    var username = req.body.username;
    var pokemon1 = req.body.pokemon1;
    var pokemon2 = req.body.pokemon2;
    var pokemon3 = req.body.pokemon3;
    var pokemon4 = req.body.pokemon4;
    var pokemon5 = req.body.pokemon5;
    var pokemon6 = req.body.pokemon6;

    await insertUser(username, function(){
        console.log(`In insertUser callback!`);
    });

    // get userID

    const get_id = await selectUserID(function(results){
        results = JSON.stringify(results);
        console.log(results);
        return results;
    });

    await insertPokemon(get_id, pokemon1, pokemon2, pokemon3, pokemon4, pokemon5, pokemon6, function(){
        console.log('In insertPokemon callback!');
        res.status(200).send("Added pokemon for user" + get_id);
    });
});

app.get('/party', async (req, res, next) => {
    await selectPokemon(function(results){
        res.status(200).send(results);
    });
});


// Helper functions
const insertUser = async function(un, callback){
    connection.query(`INSERT INTO Users (Username)
    VALUES ("${un}")`,
    function(error, results, fields) {
        if (error) throw error;
        callback(results);
    });
}

const insertPokemon = async function(uid, p1, p2, p3, p4, p5, p6, callback) {
    connection.query(`INSERT INTO Party (User_ID, Pokemon_1, Pokemon_2, Pokemon_3, Pokemon_4, Pokemon_5, Pokemon_6)
    VALUES (${uid}, "${p1}", "${p2}", "${p3}", "${p4}", "${p5}", "${p6}")`,
    function(error, results, fields) {
        if (error) throw error;
        callback(results);
    });
}

const selectPokemon = async function(callback) {
    connection.query(`SELECT * FROM Party`, function(error, results, fields){
        if(error) throw error;
        callback(results);
    });
}

const selectUserID = async function(callback) {
    connection.query(`SELECT MAX(User_ID) FROM Users`, function(error, results, fields){
        if (error) throw error;
        callback(results[0]["MAX(User_ID)"]);
    });
}

1 Ответ

0 голосов
/ 10 апреля 2020

Есть много проблем с вашим кодом. Вы не понимаете, что async/await делает. В вашем коде нет обещаний, но вы по-прежнему используете async/await.

Если вы действительно хотите написать: await selectUserID, этот метод должен возвращать обещание.

Обещание здесь, чтобы избежать callback функций.

Пример получения userId:

const selectUserID = async function () {
  return new Promise(function (resolve, reject) {
    connection.query(`SELECT MAX(User_ID) FROM Users`, function (error, results, fields) {
      if (error) return reject(error);
      resolve(results[0]["MAX(User_ID)"]);
    });
  })
}

Еще один момент, будьте внимательны с вашими запросами SQL: если вы делаете это таким образом, вы рискуете SQL Инъекционные атаки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...