首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >评估获取请求的javascript

评估获取请求的javascript
EN

Stack Overflow用户
提问于 2018-10-06 20:30:07
回答 2查看 890关注 0票数 0

我正在使用node.js on Windowsexpress模块来生成一个HTML,其中我希望从服务器处理的函数getfiledata()返回数据(即,我不想公开我的js或txt文件)。

我一直在尝试使用fetch()getfiledata()返回值。

问题:我无法将getfiledata()中的数据返回给fetch()

HTML

<!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));
  });
}
</script>

<input type="button" value="Submit" onClick="fetcher()">

</body>
</html>

^^包含我的fetch()函数

服务器

var express = require("express");
var app     = express();
var compute = require("./compute")

app.post('/compute',compute.getfiledata);

compute.js

var fs = require('fs');

module.exports={
  getfiledata: function() {
    console.log("we got this far");
    fs.readFile("mytextfile.txt", function (err, data) {
        if (err) throw err;
        console.log("data: " + data);
        return data;
    })
  }
}

^^包含我的服务器端函数

注意:在compute.js中,控制台成功记录:

我们走到这一步了

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

但不从HTML中的console.log(JSON.stringify(myJson))登录

我怀疑这是因为我没有建立一个“承诺”,但我不确定,并感谢一些关于下一步是什么的指导。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-06 21:11:31

我想你已经在路上了。我建议做一些小的改变,你就可以做到了。

我建议使用fs.readFileSync,因为这是一个非常小的文件(我假设是!!),所以不会对性能造成重大影响。我们可以使用fs.readFile,但是我们需要插入一个回调,在这种情况下,我认为同步完成所有这些是很好的。

总结一下这些变化:

  • 我们需要在计算上调用getFileData(),因为它是一个function.
  • We'll使用readFileSync来读取您的文本文件(因为它很快)。
  • 我们将调用res.json来将响应编码为json。
  • 我们将使用express静态中间件来服务index.html。

要测试这一点,请确保所有文件都在同一目录中。

点击下面的命令即可服务:

node server.js

然后转到http://localhost/查看网页。

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);

compute.js

var fs = require('fs');

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

index.html

<!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>

mytextfile.txt

那么,为什么对你来说没有什么,因为世界上没有好坏之分,但思想使它如此。

票数 1
EN

Stack Overflow用户

发布于 2018-10-07 07:41:03

你这里有几个问题。首先,不能直接从getfiledata()返回异步数据。有关该问题的完整描述,请参阅How do I return the response from an asynchronous call?。您必须使用回调来传递回异步结果(就像fs.readFile()一样),或者您可以将履行的承诺返回给异步值。

只是从路由处理程序返回一个值并不会做任何事情。

您不应该在任何地方的任何服务器中使用同步I/O,除非在启动代码中,因为这绝对会破坏您的服务器同时处理多个请求的能力。相反,同步I/O强制以串行方式处理请求(整个服务器进程处于等待状态,在操作系统从磁盘获取数据时什么也不做),而不是让服务器在等待磁盘I/O时使用所有可用的CPU周期来处理其他请求。

记住这些,你的解决方案就非常简单了。我建议使用promises,因为这是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模块中的promises应用程序接口,因此您甚至不必像我上面所做的那样手动终止它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52679106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档