在浏览器刷新两次之前,NodeJS 脚本没有响应

NodeJS script not responding until browser refreshed twice

我有以下脚本,它将 URL 作为参数并从 MariaDB 检索数据并显示它。

var express = require('express');
var app = express();
var Client = require('mariasql');
var http = require("http");
var url = require("url");
var output;

var c = new Client({
    host: '127.0.0.1',
    user: 'root',
    db: 'MyDB'
});

http.createServer(function(request, response) 
{
    var parsed = url.parse(request.url);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    if(String(parsed.href) == "/")
    {
        c.query('SELECT * FROM table',
                null,
                //{ useArray: true },
                function(err, rows)
                {
                    if(err)
                    {
                        output = "Incorrect Argument";
                    }
                    else
                    {
                        output = rows;
                    }
                }
        );
        c.end();
    }
    response.end(output);                  
}).listen(3000);

现在,当我 运行 脚本时,浏览器上显示的输出是正确的,但只有在我刷新浏览器两次时才会出现。 我对 NodeJS 真的很陌生,我不知道问题出在哪里,也不知道我到底哪里出错了。

c.query是一个异步函数,所以把输出放在回调中:

http.createServer(function(request, response) {
var parsed = url.parse(request.url);
response.writeHead(200, {'Content-Type': 'text/plain'});
if(String(parsed.href) == "/") {
  c.query('SELECT * FROM table', null, function(err, rows){
      if (err) {
          output = "Incorrect Argument";
      } else {
          output = rows;
      }
      response.end(output);
  });
  c.end();
}    
}).listen(3000);

此外,您需要将行转换为有效的输出格式。您真的要将它们发送为 text/plain 吗?

在 Node/javascript 中,回调函数可能会在不同的时间调用。例如,在您的代码中,查询的回调在结束响应后返回 - 您应该在回调块中结束响应,如下所示:

var express = require('express');
var app = express();
var Client = require('mariasql');
var http = require("http");
var url = require("url");
var output;

var c = new Client({
   host: '127.0.0.1',
   user: 'root',
   db: 'MyDB'
});

http.createServer(function(request, response) {

    var parsed = url.parse(request.url);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    if(parsed.href == "/") {
      c.query('SELECT * FROM table',
        null,
        //{ useArray: true },
        function(err, rows)
        {
            if(err)
            {
                response.statusCode = 404;
                response.end();
            }
            else
            {
                output = rows;
                response.end(output);
            }

        });
}}).listen(3000);