我正在使用node.js on Windows和express模块来生成一个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))
登录
我怀疑这是因为我没有建立一个“承诺”,但我不确定,并感谢一些关于下一步是什么的指导。
发布于 2018-10-06 21:11:31
我想你已经在路上了。我建议做一些小的改变,你就可以做到了。
我建议使用fs.readFileSync,因为这是一个非常小的文件(我假设是!!),所以不会对性能造成重大影响。我们可以使用fs.readFile,但是我们需要插入一个回调,在这种情况下,我认为同步完成所有这些是很好的。
总结一下这些变化:
要测试这一点,请确保所有文件都在同一目录中。
点击下面的命令即可服务:
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
那么,为什么对你来说没有什么,因为世界上没有好坏之分,但思想使它如此。
发布于 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应用程序接口,因此您甚至不必像我上面所做的那样手动终止它。
https://stackoverflow.com/questions/52679106
复制相似问题