[英]Unable to retrieve value from function Javascript/Node.JS
我正在嘗試插入用戶的用戶名,然后我試圖將他們的 user_id(在 MySQL 表中自動遞增)插入到 Party 表中,如下面的代碼所示。 每當我控制台記錄來自 selectUserID 的結果時,我都會得到 user_id 沒有任何問題。
每當我嘗試將 user_id 放入 insertPokemon function 時,它根本不起作用。 如果我硬編碼一個值,它顯然可以工作,但如果我使用它,get_id 將始終嘗試輸入“未定義”值,並且根本不允許任何插入。 僅使用 insertUser function 插入用戶名時,我根本沒有任何問題。 有誰知道我如何將 selectUserID results/user_id 傳遞到 insertPokemon function 中? 我也嘗試將結果傳遞給一個變量,但沒有任何運氣。
附加說明:當我 console.log(results) 它返回我想要的正確 integer 時,但是當我實際返回結果時,它總是未定義。
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)"]);
});
}
你的代碼有很多問題。 您誤解了async/await
的作用。 您的代碼中沒有任何承諾,但您仍然使用async/await
。
如果你真的想寫: await selectUserID
,這個方法應該返回一個 Promise。
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 注入攻擊的風險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.