Я пытаюсь объединить два образца кода: один показывает html-файл с использованием node js, другой - доступ к базе данных с помощью node js. Когда я пытаюсь объединить этот код, я не могу достичь своей цели по отображению запроса базы данных на HTML-странице.
Вот мой код:
var http = require('http');
var fs = require('fs');
// Database
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<br><h1>Hello World!</h1>');
res.write('<br><h2>Access Database</h2>');
var dbresult='1. test \n';
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
//if (err) throw err;
if (err) {
console.error('There was an error connecting to mongodb', err);
}
var dbo = db.db("testdb");
// findone()
dbo.collection("products").findOne({}, function(err, result) {
//if (err) throw err;
if (err) {
console.error('Error calling findOne()', err);
}
//res.write("\n1. ");
//res.write(result.name);
console.info("\n1. ");
console.info(result.name);
dbresult += result.name;
res.write(dbresult);
db.close();
});
});
//res.write(dbresult);
res.end();
/*fs.readFile('demofile1.html', function(err, data) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
res.end();
});*/
}).listen(8080);
Если я помещу res.write () в Mongoclient.connect (), консоль покажет «Ошибка [ERR_STREAM_WRITE_AFTER_END]: запись после завершения».
Если я поставлю res.write () после Mongoclient.connect (), данные не будут отображаться. Я пробовал использовать console.info, без проблем.
Что не так в моем коде? Спасибо...
Ну да, это сработало, если я поместил res.end () чуть ниже res.write (dbresult). Я думаю, это из-за вызова функции async.
Да, действительно, это связано с функцией async.





Вам нужно поместить
res.end()в функцию обратного вызоваdbo.collection, т.е. сразу послеres.write(dbresult).