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

时间:2015-10-12 19:31:19

标签: javascript node.js curl mariadb

我有以下脚本将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真的很陌生,我不知道问题是什么,以及我哪里出错了。

2 个答案:

答案 0 :(得分:1)

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吗?

答案 1 :(得分:1)

在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);