【问题标题】:http server respnd with an output from an async functionhttp服务器响应异步函数的输出
【发布时间】:2021-12-28 17:17:13
【问题描述】:

我希望我的 http 响应脚本响应来自我的 SQL 服务器的数据。所以我可以使用 AJAX 用我的 SQL 服务器中的数据更新 HTML。我找不到办法做到这一点。我只是在学习异步,我有一种感觉,如果我可以将异步函数的输出保存到全局变量中,那么它将起作用。任何帮助都会让我头疼。

我的简单 Listen 脚本是:

var test = "hello!"

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write(test);
  res.end();
}).listen(8080); 

我的sql代码是:

const util = require('util');
var mysql = require('mysql');

var con = mysql.createConnection({
    host: "XXXXX",
    user: "XXXXX",
    password: "XXXXX",
    database: "XXX"
  });

var DBresult=null;

function getdb(){
  const query = util.promisify(con.query).bind(con);
  (async () => {
    try {
      const rows = await query('SELECT * FROM mylist');
      DBresult=rows;
     
    } finally {
      con.end();
    }
  })()
}

【问题讨论】:

    标签: javascript node.js asynchronous httpresponse


    【解决方案1】:

    不要对服务器中的异步结果使用任何全局变量或共享的更高范围的变量。永远不要那样做。这是一种有充分理由的反模式,因为这可能会产生间歇性并发问题,因为服务器上可以同时处理多个请求,因此这些会导致对这些变量的访问冲突,从而产生间歇性的、非常难以处理的问题-调试问题。我再重复一遍,绝不。

    您没有描述您尝试为其编写代码的确切情况,但这里有一个示例。

    相反,您可以在从异步调用到达的上下文中使用结果。如果你可以使用await,那通常会使编码更干净。

    这是一个简单的例子:

    const con = mysql.createConnection({
        host: "XXXXX",
        user: "XXXXX",
        password: "XXXXX",
        database: "XXX"
    });
    
    const query = util.promisify(con.query).bind(con);
    
    http.createServer(async function(req, res) {
        if (req.path === "/query" && req.method === "GET") {
            try {
                const rows = await query('SELECT * FROM mylist');
                res.writeHead(200, { 'Content-Type': 'application/json' });
                res.end(JSON.stringify(rows));
            } catch(e) {
                console.log(e);
                res.statusCode = 500;
                res.end();
            }
        } else {
            // some other respone
            res.writeHead(200, { 'Content-Type': 'text/plain' });
            res.write("hello");
            res.end();
        }
    }).listen(8080);
    

    注意事项:

    1. 在处理请求之前检查路径和方法。
    2. 制作回调函数async,使其可以使用await
    3. 确保await 的任何承诺拒绝都被try/catch 捕获,并在出现错误时发送错误响应。
    4. 以 JSON 格式发送结果并设置适当的内容类型。
    5. 您可能会使用简单的http 模块作为学习体验,但您很快会发现使用简单的Express framework 可以节省大量编程时间并使事情变得更容易。

    【讨论】:

    • 我从没想过全局变量的问题 谢谢!为了给你一些背景知识,我正在制作一个网页,它将为我的 SQL 数据库中的每一行添加一张新卡片。但我需要为客户端使用 AJAX 从 nodejs 应用程序请求表数据。我现在将研究 Express 框架。感谢您的宝贵时间!
    • 我刚刚测试了它并且工作正常!谢谢!!
    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多