Javascript node.js如何停止正在运行的api
我使用“tailstream”创建了一个脚本来读取一个不断增长的文件,该脚本运行良好,代码如下所示Javascript node.js如何停止正在运行的api,javascript,jquery,node.js,Javascript,Jquery,Node.js,我使用“tailstream”创建了一个脚本来读取一个不断增长的文件,该脚本运行良好,代码如下所示 var http = require('http'); var tailstream = require('tailstream'); http.createServer(function(req, res) { var filename = "D:\\test.txt"; var readStream = tailstream.createReadStream(filename);
var http = require('http');
var tailstream = require('tailstream');
http.createServer(function(req, res) {
var filename = "D:\\test.txt";
var readStream = tailstream.createReadStream(filename);
readStream.on('open', function () {
readStream.pipe(res);
});
readStream.on('error', function(err) {
res.end(err);
});
setTimeout(function () {
console.log('timeout completed');
readStream.done();
}, 10000);
//readStream.done();
}).listen(8080);
它工作完全正常,在setTimeout中提到的10秒后停止读取。我想这是停止从一个按钮点击用户界面。是否可以从UI传递信号并停止流媒体?任何建议都会大有帮助
非常感谢
var stopHandler = $.noop;
stopHandler = funtion(){
//do your stuff
}
从UI调用stopHandler()这是我的解决方案,代码没有经过测试(不确定是什么
tailstream
)
您应该为您的客户端实现两个功能(浏览器、UI),它们都有一个“jobId”查询字符串参数:
readStream
并使用一个全局变量将其缓存,“jobId”用于为每个请求的readStream
编制索引,因为每个请求都会创建一个readStream
对象,因此必须为每个请求“/tail”设置“jobId”唯一(时间戳或uuid)。配对调用“/stop?jobId=1”搜索给定id并获取associatereadStream
以停止它:
const http = require('http');
const url = require('url');
const tailstream = require('tailstream');
var jobs = new Map();
http.createServer(function (req, res) {
let parsedUrl = url.parse(req.url, true);
if (parsedUrl.pathname === '/tail') { // send stream data
var filename = "D:\\test.txt";
var readStream = tailstream.createReadStream(filename);
readStream.on('open', function () {
readStream.pipe(res);
});
readStream.on('error', function (err) {
res.end(err);
});
jobs.set(parsedUrl.jobId, readStream);
} else if (parsedUrl.pathname === '/stop') { // stop job
var readStream = jobs.get(parsedUrl.jobId);
if(readStream) {
readStream.done();
}
res.end();
}
}).listen(8080);
什么是用户界面?重定向到服务器的页面还是什么?这将在app.js中,并从html页面的$http调用。$http?请添加所有必要的信息…感谢您的及时回复。我只想检查一个问题。这在单独的脚本节点中运行时有效,但当我将此代码放入app.js中,并从ui($http({url:'/readTfile'})调用时,由于某些原因它不起作用。请有人放一些灯。这就是我所说的一个好答案;),但在用于生产之前,你应该随机化ID并添加正确的错误处理……除此之外,你最好调用“jobs.delete(jobId)”删除“done()”之后的
readStream
对象并处理错误。