在浏览器刷新两次之前,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);
我有以下脚本,它将 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);