Как распечатать обещанные данные на веб-странице? - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь вывести массив строк из базы данных в раскрывающееся меню на веб-сайте, который я создал. У меня все работает нормально, за исключением окончательной передачи данных из метода поиска на сайт. Сейчас данные в форме Обещания, и я не могу понять, как их распечатать на моей веб-странице. сейчас я просто отправляю его на localhost: 3000, я еще не дошел до того места, где я помещаю его в выпадающий список. Как бы я это сделал?

Я нашел очень очень мало по этой проблеме в Интернете и, таким образом, в основном просто пытался взломать исправления, которые на самом деле не работали (использование метода resol (), метода all ()). оба из них привели к синтаксическим ошибкам. Кстати, все имена Var / SQL были изменены. Моя последняя попытка ниже:

//code that sends the names to the webpage
 app.get('/formfetch', function(req, res) {
            const data = async() => {
                let rawDat = await dbFormFetch.getNames();
                return rawDat;
             }
            }
        const hNs = data();
        hNs.then((names) => {
                if (names === null) {
                    res.end("Error: Names list came through as null.");
                } else if (names.length > 0) {
                    resolve(names);
                    for (var i = 0; i < names.length; i++) {
                        res.end(names[i]);
                    }
                    res.status('200');
                }
            })
            .catch((err) => {
                res.status('404').json(err)
                console.log("conversion of promise failed")
            })
    });



//the getNames() method  (in a different file) 
async function getNames() {
    console.log("trying to get Names");
    let query = `select NAME from NAMESTAB`;
    console.log("query: " + query);
    const binds = {};
    const result = await database.simpleExecute(query, binds);
    var results = [];
    console.log("for loop in formfetch.js: ");
    for (var i = 0; i < result.rows.length; i++) {
        results[i] = i + ": " + result.rows[i].NAME+ ' \n';
     }
    return results;
    }

Метод res.send из функции app.get выводит на локальный хост «Сделано на веб-сервере:». Я проверил консоль и не увидел ничего скрытого в html или что-то в этом роде.

** Примечание: все данные, которые должны быть в обещании, находятся в коде (я могу распечатать его на консоли в любой точке кода), но когда я размещу его на веб-сайте, он не будет напечатан. **

1 Ответ

1 голос
/ 02 июля 2019

такой большой сюрприз, я все делал неправильно.Урок дня: прочтите «Обещания» и их работу, прежде чем запускать и пробовать свой асинхронный код.Это не так интуитивно понятно, как хотелось бы.

// I only had made changes to the first of the two methods. 
app.get('/formfetch', function(req, res) {
            async function data() {
                let rawDat = await dbFormFetch.getNames();
                return rawDat;

            }
            data().then((Names) => {
                    if (Names === undefined) {
                        res.end("Error: Names list came through as null.");
                    } else if (Names.length > 0) {
                        res.setHeader('Content-Type', 'application/json');
                        res.status(200).json({ "names": Names });
                    }
                })
                .catch((err) => {
                    res.status('404').send("name retrieval failed in server.js module")
                    console.log(err)
                    console.log("conversion of promise failed")
                })
        });

когда вы используете res.end(), он устанавливает статус заголовка и делает его неизменным после вызова этого метода, так что это было неправильное использование.Вместо этого я использовал метод setHeader(), чтобы сообщить веб-сайту, какую информацию я отправляю, а затем заполнил содержимое, связав метод .json() с ответом status(), который я отправил.Я никогда не работал с обещаниями раньше, и я довольно новичок в NodeJS, так что это было немного кривой обучения, но, надеюсь, это поможет людям, которые были там, где я был вчера.если вы новичок в обещаниях, прочитайте эту статью и эту статью , прежде чем пытаться использовать этот инструмент кодирования.Вы сэкономите часы отладки и отслеживания ошибок.

...