如何将承诺的数据打印到网页上?

时间:2019-07-01 17:10:18

标签: javascript node.js rest promise

我正在尝试将数据库中的字符串数组带到我创建的网站上的下拉菜单中。除了将数据从检索方法最终传输到网站之外,我一切正常。现在,数据是以Promise的形式出现的,我一生都无法弄清楚如何将其打印在网页上。现在,我只是将其发送到localhost:3000,我还没有将其放入下拉列表中。我该怎么做?

关于此问题,我在网上发现的很少,因此,主要是尝试实际上没有用的hack修复程序(解决resolve()方法,all()方法)。这些都导致语法错误。所有变量名称/ 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;
    }

app.get函数中的res.send方法在我的本地主机上打印出“将其制作到Web服务器:”。我检查了控制台,没有发现html或类似内容中隐藏的任何内容。

**注意:应在诺言中的所有数据都在代码中(我可以在代码中的任何位置将其打印到控制台),但是当我将其放在网站上时,它不会打印。 **

1 个答案:

答案 0 :(得分:1)

这里真是太令人惊讶了,我做错了一切。每日一课:在运行和了解一些异步代码之前,请阅读Promises及其工作方式。它不像您希望的那样直观。

// 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来说我还很陌生,所以这是一个学习曲线,但希望这会对昨天的我有所帮助。如果您不熟悉诺言,请在尝试使用此编码工具之前先参阅this articlethis article。您将节省大量调试和错误跟踪的时间。