评估获取请求的javascript

评估获取请求的javascript,javascript,html,node.js,promise,fetch,Javascript,Html,Node.js,Promise,Fetch,我在Windows上使用node.js和express模块生成一个HTML,我想从服务器处理的函数getfiledata返回数据,也就是说,我不想公开我的js或txt文件 我一直在尝试使用fetch从getfiledata返回值 问题:我无法从getfiledata获取返回到fetch的数据 HTML compute.js ^^包含我的服务器端功能 注意:控制台从compute.js成功记录: 我们走了这么远 数据:这是文本文件中的数据 但不从以下位置登录: HTML中的console.logJ

我在Windows上使用node.js和express模块生成一个HTML,我想从服务器处理的函数getfiledata返回数据,也就是说,我不想公开我的js或txt文件

我一直在尝试使用fetch从getfiledata返回值

问题:我无法从getfiledata获取返回到fetch的数据

HTML

compute.js

^^包含我的服务器端功能

注意:控制台从compute.js成功记录:

我们走了这么远

数据:这是文本文件中的数据

但不从以下位置登录: HTML中的console.logJSON.stringifymyJson


我怀疑这是因为我没有做出承诺,但我不确定,希望您能给我一些指导,告诉我下一步该怎么做。

我想您已经准备好了。我建议做一些小的改变,你就可以做到了

我建议使用fs.readFileSync,因为我认为这是一个非常小的文件!!,所以没有重大的性能打击。我们可以使用fs.readFile,但是我们需要插入一个回调,在这种情况下,我认为同步执行所有这些都是可以的

要总结这些变化:

我们需要在compute上调用getFileData,因为它是一个函数。 我们将使用readFileSync读取您的文本文件,因为它很快。 我们将调用res.json将响应编码为json。 我们将使用express静态中间件为index.html提供服务。 要测试这一点,请确保所有文件都在同一目录中

点击下面的命令发球:

node server.js
然后转到以查看网页

server.js

compute.js

index.html

mytextfile.txt


那么,为什么对你来说没有,因为没有什么好的或坏的,但是思考使它成为这样

这里有几个问题。首先,不能直接从getfiledata返回异步数据。有关该问题的完整描述,请参阅。您必须像fs.readFile一样使用回调来传回异步结果,或者可以返回满足异步值的承诺

其次,Express中的路由处理程序(如app.post)必须使用res.send或res.write或类似的方法将响应发送回调用方。仅仅从路由处理程序返回一个值并没有任何作用

第三,您已经看到了使用同步I/O的其他建议。请不要这样做。除了在启动代码中,您不应该在任何地方的任何服务器中使用同步I/O,因为这绝对会破坏您的服务器一次处理多个请求的能力。相反,同步I/O强制要求串行处理请求,整个服务器进程等待,而操作系统从磁盘获取数据时什么也不做,而不是让服务器在等待磁盘I/O时使用所有可用的CPU周期来处理其他请求

记住这些,您的解决方案非常简单。我建议使用承诺,因为这是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中,有一个用于fs模块内置承诺的实验性API,因此您甚至不必像上面那样手动承诺。或者,您可以使用几个第三方库中的任意一个,这些第三方库使您可以很容易地一次发布整个fs库,从而获得模块中所有函数的发布版本。

这与获取无关。查看有关如何提供JSON的express文档-您需要实际编写HTTP响应。是的,您无法从readFile回调返回。此处详细介绍了从getfiledata返回结果的问题的一半:。谢谢,@jfriend00。我想暂时我会按照下面的答案来处理这个同步。我留下了一条关于您链接的页面的注释,您链接的页面将来会在性能出现问题时将我的代码更新为异步。@Bergi,我现在可能会将我的代码转换为同步计算,并希望将来编写HTTP响应。谢谢,谢谢。代码是有效的,我相信它现在会满足的。我希望将来我需要利用异步处理,因为txt文件可能会增长,或者在返回浏览器之前,txt文件的内容可能会进行js计算。当心!应该可以,我不希望看到100kb以下的问题,但它很容易实现异步!在服务器路由处理程序中推荐同步I/O是个坏主意。OP正在开发一个服务器。他们应该学习使用异步I/O的正确方法。我同意,但是如果我们为同步支付1ms的罚款。io,我们需要一段时间才能解决任何重大问题。
node server.js
var express = require("express");
var compute = require("./compute");
var app     = express();

app.use(express.static("./"));

app.post('/compute', (req, res, next) => {
    var result = compute.getfiledata();
    res.status(200).json({ textData: result } );
});

app.listen(80);
var fs = require('fs');

module.exports = {
    getfiledata: function() {
      console.log("we got this far");
      return fs.readFileSync("mytextfile.txt", "utf8");
    }
}
<!DOCTYPE html>
<html>

<script type="text/javascript">
function fetcher() {
  fetch('/compute', {method: "POST"})
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(JSON.stringify(myJson));
    document.getElementById("output").innerHTML = "<b>Result: </b>" + myJson.textData;
  });
}
</script>
<input type="button" value="Submit" onClick="fetcher()">
<br><br>
<div id="output">
</div>
</body>
</html>
const util = require('util');
const readFile = util.promisify(require('fs').readFile);

module.exports= {
  getfiledata: function() {
    return readFile("mytextfile.txt");
  }
}
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);