【问题标题】:Unable to retrieve value from function Javascript/Node.JS无法从函数 Javascript/Node.JS 中检索值
【发布时间】:2020-04-11 02:45:40
【问题描述】:

我正在尝试插入用户的用户名,然后我正在尝试将他们的 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)"]);
    });
}

【问题讨论】:

    标签: javascript node.js gcloud


    【解决方案1】:

    您的代码有很多问题。您误解了 async/await 的作用。您的代码中没有任何承诺,但您仍然使用 async/await

    如果你真的想写:await selectUserID,这个方法应该返回一个 Promise。

    在这里承诺避免使用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 注入攻击的风险。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多