【问题标题】:NodeJS script not responding until browser refreshed twiceNodeJS脚本在浏览器刷新两次之前没有响应
【发布时间】:2016-01-10 09:17:11
【问题描述】:

我有以下脚本,它以 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 真的很陌生,我不知道问题出在哪里,我到底哪里出错了。

【问题讨论】:

  • 您不认为上述错误消息会对我们有所帮助吗? ;)
  • 好吧,所以我想出了在 URL 中不使用“&”的 CURL 部分。我还没有弄清楚的是浏览器刷新部分。

标签: javascript node.js curl mariadb


【解决方案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);

【讨论】:

    【解决方案2】:

    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 发送它们吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多