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