Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点繁殖过程_Node.js_Http_Express_Spawn - Fatal编程技术网

Node.js 节点繁殖过程

Node.js 节点繁殖过程,node.js,http,express,spawn,Node.js,Http,Express,Spawn,无法在下面的脚本中找到问题,我想用脚本实现的是一个节点日志服务器,它将侦听post请求,并将日志标题和日志详细信息作为查询参数,写入文件,然后在get请求上作为json返回 问题: 有时它会不断显示加载程序,有时会给出所需的日志 注意: plz建议,如果有人有更好的解决方案,那么在日志记录过程中,生成过程是为了更新浏览器 电话留言: http://127.0.0.1:8081/log?title="test"&detail="test detail" var express = req

无法在下面的脚本中找到问题,我想用脚本实现的是一个节点日志服务器,它将侦听
post
请求,并将日志标题和日志详细信息作为查询参数,写入文件,然后在
get
请求上作为json返回

问题: 有时它会不断显示加载程序,有时会给出所需的日志

注意: plz建议,如果有人有更好的解决方案,那么在日志记录过程中,生成过程是为了更新浏览器

电话留言:

http://127.0.0.1:8081/log?title="test"&detail="test detail"
var express = require("express");
var spawn = require('child_process').spawn;
var fs = require("fs");

var srv = express();

var outputFilename = '/tmp/my.json';

function getParamsObject(context) {
    var params = {};

    for (var propt_params in context.params) {
        params[propt_params] = context.params[propt_params];
        //define(params, propt_params, context.params[propt_params]);
    }

    for (var propt_body in context.body) {
        params[propt_body] = context.body[propt_body];
        //define(params, propt_body, context.body[propt_body]);
    }

    for (var propt_query in context.query) {
        params[propt_query] = context.query[propt_query];
        //define(params, propt_query, context.query[propt_query]);
    }

    return params;
}


srv.get("/", function(req, res) {
    res.send("Hello World From Index\n");

});

srv.get("/Main", function(req, res) {
    res.send("Hello World From Main\n");
});

srv.get("/ReadFile", function(req, res) {
    fs.readFile("example_one.txt", function(err, data) {

        if(err) throw err;

        res.send(data.toString());

    });
});

srv.get("/ReadFileJSON", function(req, res) {
    fs.readFile("example_one.txt", function(err, data) {

        if(err) throw err;

        res.setHeader("content-type", "application/json");
        res.send(new Parser().parse(data.toString()));

    });

});


srv.post("/log", function(req, res) {

    var input = getParamsObject(req);

    if(input.detail) {
    var myData = {
        Date: (new Date()).toString(),
                Title: input.title,
                Detail: input.detail
    }

    fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
            if(err) {
                console.log(err);
            }
    }); 
    }
    res.setHeader("content-type", "application/json");
    res.send({message:"Saved"});

});

srv.get("/log", function(req, res) {

    var child = spawn('tail', ['-f', outputFilename]); 
    child.stdout.pipe(res);

    res.on('end', function() {
        child.kill(); 
    });
});


srv.listen(8081);
console.log('Server running on port 8081.');
代码:

http://127.0.0.1:8081/log?title="test"&detail="test detail"
var express = require("express");
var spawn = require('child_process').spawn;
var fs = require("fs");

var srv = express();

var outputFilename = '/tmp/my.json';

function getParamsObject(context) {
    var params = {};

    for (var propt_params in context.params) {
        params[propt_params] = context.params[propt_params];
        //define(params, propt_params, context.params[propt_params]);
    }

    for (var propt_body in context.body) {
        params[propt_body] = context.body[propt_body];
        //define(params, propt_body, context.body[propt_body]);
    }

    for (var propt_query in context.query) {
        params[propt_query] = context.query[propt_query];
        //define(params, propt_query, context.query[propt_query]);
    }

    return params;
}


srv.get("/", function(req, res) {
    res.send("Hello World From Index\n");

});

srv.get("/Main", function(req, res) {
    res.send("Hello World From Main\n");
});

srv.get("/ReadFile", function(req, res) {
    fs.readFile("example_one.txt", function(err, data) {

        if(err) throw err;

        res.send(data.toString());

    });
});

srv.get("/ReadFileJSON", function(req, res) {
    fs.readFile("example_one.txt", function(err, data) {

        if(err) throw err;

        res.setHeader("content-type", "application/json");
        res.send(new Parser().parse(data.toString()));

    });

});


srv.post("/log", function(req, res) {

    var input = getParamsObject(req);

    if(input.detail) {
    var myData = {
        Date: (new Date()).toString(),
                Title: input.title,
                Detail: input.detail
    }

    fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
            if(err) {
                console.log(err);
            }
    }); 
    }
    res.setHeader("content-type", "application/json");
    res.send({message:"Saved"});

});

srv.get("/log", function(req, res) {

    var child = spawn('tail', ['-f', outputFilename]); 
    child.stdout.pipe(res);

    res.on('end', function() {
        child.kill(); 
    });
});


srv.listen(8081);
console.log('Server running on port 8081.');

有两件事似乎是不必要的复杂因素,可能是你问题的根源

首先,
spawn
似乎没有必要。您似乎希望打开一个文件进行读取,并在文件中添加内容时进行更新。您可以在节点或模块中执行此操作。这可能比使用
spawn()
创建子进程更健壮


其次(我认为这不太可能是问题的根源),您似乎在
POST
请求上使用了查询字符串参数。虽然不是无效的,但这是不寻常的。通常,如果您使用的是
POST
方法,则可以通过POST发送数据,作为请求正文的一部分。如果使用
GET
方法,数据将作为查询字符串发送。如果您不使用身体发送数据,请切换到
GET

有几件事情似乎是不必要的复杂问题,这可能是问题的根源

首先,
spawn
似乎没有必要。您似乎希望打开一个文件进行读取,并在文件中添加内容时进行更新。您可以在节点或模块中执行此操作。这可能比使用
spawn()
创建子进程更健壮


其次(我认为这不太可能是问题的根源),您似乎在
POST
请求上使用了查询字符串参数。虽然不是无效的,但这是不寻常的。通常,如果您使用的是
POST
方法,则可以通过POST发送数据,作为请求正文的一部分。如果使用
GET
方法,数据将作为查询字符串发送。如果您不使用身体发送数据,请切换到
GET

有几件事情似乎是不必要的复杂问题,这可能是问题的根源

首先,
spawn
似乎没有必要。您似乎希望打开一个文件进行读取,并在文件中添加内容时进行更新。您可以在节点或模块中执行此操作。这可能比使用
spawn()
创建子进程更健壮


其次(我认为这不太可能是问题的根源),您似乎在
POST
请求上使用了查询字符串参数。虽然不是无效的,但这是不寻常的。通常,如果您使用的是
POST
方法,则可以通过POST发送数据,作为请求正文的一部分。如果使用
GET
方法,数据将作为查询字符串发送。如果您不使用身体发送数据,请切换到
GET

有几件事情似乎是不必要的复杂问题,这可能是问题的根源

首先,
spawn
似乎没有必要。您似乎希望打开一个文件进行读取,并在文件中添加内容时进行更新。您可以在节点或模块中执行此操作。这可能比使用
spawn()
创建子进程更健壮


其次(我认为这不太可能是问题的根源),您似乎在
POST
请求上使用了查询字符串参数。虽然不是无效的,但这是不寻常的。通常,如果您使用的是
POST
方法,则可以通过POST发送数据,作为请求正文的一部分。如果使用
GET
方法,数据将作为查询字符串发送。如果您没有使用正文发送数据,请切换到
GET

以澄清问题

  • 您需要将一些请求写入日志文件
  • 您希望通过HTTP有效地执行日志尾部,并且当前正在通过在子进程中生成
    tail
    来执行此操作
  • 这并不是那么有效
问题:有时它会不断显示loader,有时会给出所需的日志

Web浏览器缓冲数据。当然,您正在发送数据,但在达到最小缓冲区大小之前,浏览器不会显示数据。然后,当所有标记(或在本例中仅为文本)尚未加载时,将显示哪些内容。基本上,您不能将响应流式传输到客户端,并且可靠地期望客户端在流式传输完成之前对其执行任何操作。因为你在跟踪一个日志,这让你陷入了一个糟糕的困境

您必须做的是找到一种不同的方式将数据发送到客户端。这是web套接字的一个很好的候选者。您可以在客户端和服务器之间创建持久连接,然后立即处理数据,而不用担心客户端缓冲区。由于您已经在使用Node.js,我建议您仔细研究一下,因为它提供了一种快速启动和运行web套接字的方法,并且在当前浏览器上无法使用web套接字的情况下,长轮询JSON(以及其他)是一种备用方法


接下来,不需要产生另一个进程来以与
tail
相同的方式读取文件。正如Trott所指出的,有一个NPM包可以完全满足您的需要:只需为
事件设置一个事件处理程序,然后在web套接字上触发一个
事件,这样您的JavaScript客户机就可以接收它并立即向用户显示它。

为了澄清这个问题

  • 您需要将一些请求写入日志文件
  • 你想有效地做一个日志ta吗