javascript - 类型错误 : Cannot read property 'id' of undefined & bad variable log

标签 javascript es6-promise

我有 2 个问题:我正在尝试在代码中插入 Promise.all,我需要 Promise.all 来进行异步数据库调用。

第一个问题是,通过使用我将在下面发布的代码(代码A),当我记录“idArticolo”变量时,在控制台中结果是“getIdArticolo()”函数的所有代码,(我的意思是它只是将我记录在要执行的书面代码中,而不是我想要的变量的值),也许我不必使用 getIdArticolo 函数,而是使用变量?

我尝试使用变量var getIdArticolo = new Promise(代码B),它给了我另一个错误:

"TypeError: Cannot read property 'id' of undefined", referring to the code "resolve (result [0] .id ); "," result "is undefined!

为什么?

实际上,它是完全相同的代码,只不过一个是在一个函数中,另一个是变量的赋值。显然我要么使用A代码,要么使用B代码,对我不想执行的代码进行注释。

所有代码:

var mysql = require('mysql')
var http = require('http')
var url = require('url');
var express = require("express");
var cors = require('cors')

var app = express();

var sql = "";
var connection = mysql.createConnection({
      host: '127.0.0.1',
      user: 'andrea',
      password: 'password',
      database: 'spesa'
});
connection.connect();

function LinkMysql() {

    var data = '';

    return new Promise(function(resolve,reject) {
        connection.query(sql, function(err, result) {

            if(err)
                console.log("error: " + err);

            resolve(result);
        });

    });

}  

var idArticolo;
var idCategoria;
var nuovoId;

var articolo, costo, quantita, negozio, data;

app.use(cors());

app.get('/inserisciDati',function(request, response){

    console.log("/inserisciDati");
    /*
    console.log("/inserisciDati");
    console.log("articolo="+request.query.articolo);
    console.log("costo="+request.query.costo);
    console.log("quantita="+request.query.quantita);
    console.log("negozio="+request.query.negozio);
    console.log("data="+request.query.data);
    */
    articolo = request.query.articolo;
    costo = request.query.costo;
    quantita = request.query.quantita;
    negozio = request.query.negozio;
    data = request.query.data;

    //INSERIRE RISPOSTA ALLA PAGINA HTML CON ERRORE SE C'È

    //recuperare gli id dell' articolo e del negozio, l' id categoria dell'articolo e il nuovo id del registro

    getValues();

    //INSERIRE I DATI IN TABLLA MYSQL

});

function getValues(){

    Promise.all([getIdArticolo, getIdCategoria, getLastId]).then(function(values){

        idArticolo = values[0];
        idCategoria = values[1];
        nuovoId = values[2];

        console.log("idArticolo="+idArticolo);

        sql="INSERT INTO registro VALUES ('" + nuovoId + "','" + articolo + "','" + idCategoria + 
        "','" + idArticolo + "','" + costo + "','" + quantita + 
        "','" + negozio + "','" + data + "')";

        //console.log("sql="+sql);

    });

}

var getIdArticolo = new Promise(function(resolve, reject){

    sql = "SELECT id FROM articoli WHERE articolo = '" + articolo + "'";

    connection.query(sql, function(err, result) {

        if(err)
            console.log("error: " + err);

        resolve(result[0].id);

    });

});

function getIdArticolo(){

    return new Promise(function(resolve,reject) {

        sql = "SELECT id FROM articoli WHERE articolo = '" + articolo + "'";

        connection.query(sql, function(err, result) {

            if(err)
                console.log("error: " + err);

            resolve(result[0].id);

        });

    });

}

function getIdCategoria(){

    return new Promise(function(resolve, reject){

        sql = "SELECT id_categoria FROM articoli WHERE articolo = '" + articolo + "'";

        connection.query(sql, function(err, result) {

            if(err)
                console.log("error: " + err);

          resolve(result[0].id_categoria);

        });

    });

}

function getLastId(){

    return new Promise(function(resolve, reject){

        sql = "SELECT id FROM registro ORDER BY id DESC LIMIT 1";

        connection.query(sql, function(err, result) {
            if(err)
                console.log("error: " + err);

            resolve(result[0].id);

        });

    });

}

app.get('/getArticoli', function(request, response){

    console.log("/getArticoli");
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
    response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    response.setHeader("X-Powered-By",' 3.2.1');
    response.setHeader("Content-Type", "application/json");

    sql = 'SELECT articolo FROM articoli ORDER BY articolo ASC';

    LinkMysql().then(function(val) {

        response.writeHead(200, {'content-Type': 'text/plain; charset=utf-8'});
        response.end(JSON.stringify(val));

    });

});

app.get('/getNegozi', function(request, response){

    console.log("/getNegozi");
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
    response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    response.setHeader("X-Powered-By",' 3.2.1');
    response.setHeader("Content-Type", "application/json");

    sql = 'SELECT negozio FROM negozi ORDER BY negozio ASC';

    LinkMysql().then(function(val) {

        response.writeHead(200, {'content-Type': 'text/plain; charset=utf-8'});
        response.end(JSON.stringify(val));

    });

});

app.listen(8080);

代码 A 摘录:

function getIdArticolo(){

    return new Promise(function(resolve,reject) {

        sql = "SELECT id FROM articoli WHERE articolo = '" + articolo + "'";

        connection.query(sql, function(err, result) {

            if(err)
                console.log("error: " + err);

            resolve(result[0].id);

        });

    });

}

代码 B 摘录:

var getIdArticolo = new Promise(function(resolve, reject){

sql = "SELECT id FROM articoli WHERE articolo = '" + articolo + "'";

    connection.query(sql, function(err, result) {

        if(err)
            console.log("error: " + err);

        resolve(result[0].id);

    });

});

LOG OF CODE A

谢谢!

最佳答案

这两种方法似乎都存在一些问题:

看起来您忘记了调用返回 promise 的函数。

例如:代码 A 是 getIdArticolo,必须调用 getIdArticolo() 以返回一个 Promise,您可以在 Promise.all< 内部等待该 Promise/ 声明。


Promise.all([getIdArticolo(), getIdCategoria()]).then(result => { 


});

另外,请记住,当将某些内容声明为变量时,如 var getIdArticolo = new Promise() 中,变量声明为 hoisted

关于javascript - 类型错误 : Cannot read property 'id' of undefined & bad variable log,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57396475/

相关文章:

php - 新用户上线时自动刷新

javascript - 是什么让 `async/await` 语句在 ES6 中顺序运行而不是并行运行?

javascript - 我应该从哪里调用 module.exports 来获取非空值?

javascript - 我是否正确使用了这个 Promise 功能

javascript - axios get 和promise 函数

javascript - 如何在dojo中模拟无模式窗口对话框,以便我们可以打开多个窗口 Pane

javascript - 为什么 "~undefined"在 JavaScript 中是 -1?

javascript - jquery ul切换问题

javascript - 从 Microsoft Graph API 请求列表项时收到空数组

node.js - 如何解析 Node.js mssql promise