У вас есть пара проблем здесь.Во-первых, вы не можете напрямую возвращать асинхронные данные из getfiledata()
.См. Как мне вернуть ответ от асинхронного вызова? для полного описания этой проблемы.Вы должны либо использовать обратный вызов для передачи асинхронных результатов (как это делает fs.readFile()
), либо вы можете вернуть обещание, которое соответствует асинхронному значению.
Во-вторых, обработчик маршрута в Express, такой как app.post()
должен использовать res.send()
или res.write()
или что-то в этом роде, чтобы отправить ответ вызывающей стороне.Простой возврат значения из обработчика маршрута ничего не делает.
В-третьих, вы видели другие предложения по использованию синхронного ввода-вывода.Пожалуйста, пожалуйста, не делай этого.Вы НИКОГДА не должны использовать синхронный ввод-вывод на любом сервере, кроме как в коде запуска, потому что это абсолютно разрушает вашу способность обрабатывать несколько запросов одновременно.Вместо этого синхронный ввод-вывод заставляет запросы обрабатываться последовательно (при этом весь процесс сервера ожидает и ничего не делает, пока ОС извлекает данные с диска), а не позволяет серверу использовать все доступные циклы ЦП для обработки других запросов во время ожидания диска.I / O.
Учитывая это, ваше решение довольно простое.Я предлагаю использовать обещания, потому что это будущее Javascript и node.js.
Ваш compute.js:
const util = require('util');
const readFile = util.promisify(require('fs').readFile);
module.exports= {
getfiledata: function() {
return readFile("mytextfile.txt");
}
}
И ваш server.js:
const express = require("express");
const compute = require("./compute");
const app = express();
app.use(express.static("./"));
app.post('/compute', (req, res) => {
compute.getfiledata().then(textData => {
res.json({textData});
}).catch(err => {
console.log(err);
res.sendStatus(500);
});
});
app.listen(80);
В node.js версии 10 имеется экспериментальный API для обещаний, встроенный в модуль fs
, поэтому вам даже не нужно обещать его вручную, как я делал выше.Или вы можете использовать любую из нескольких сторонних библиотек, которые действительно упрощают одновременное обещание всей библиотеки fs
, поэтому у вас есть обещанные версии всех функций в модуле.