如何从目录中读取文件并作为 JSON 发送给客户端?

Posted

技术标签:

【中文标题】如何从目录中读取文件并作为 JSON 发送给客户端?【英文标题】:How can I read files from directory and send as JSON to client? 【发布时间】:2016-11-01 10:14:27 【问题描述】:

我在服务器目录中有日志文件,我想向客户端显示文件名,所以我创建了readDirectory.js,它可以正确读取名称现在我对node.js 很陌生,我正在尝试发送json 数据到客户端,但它没有发生,我如何使用 express 将日志文件名发送给客户端?

readDirectory.js

var fs = require('fs');
var path = './Logs'
var Logs = [];
function readDirectory()
    fs.readdir(path, function(err, items) 
        Logs.push(items);
       /* console.log(items);
        for (var i=0; i<items.length; i++) 
            console.log(items[i]);
        */

    );
 return Logs;

exports.readDirectory = readDirectory;

app.js

 var express = require('express');
    var app = express();
    var readDirectory = require('./readDirectory');
    app.use(express.static(__dirname + "/public"));

    app.get('/logs',function(req,res)
    res.send(readDirectory.readDirectory());
   );

angularFactory.js

angular.module('App').factory('DitFactory', function ($http) 
    'use strict';
    var data;
    return 
        data:"data from factory"
       getLogs: function () 
            return $http.get('/logs')
                .then(function (response) 
                    return response.data;
                );
        
    

);

【问题讨论】:

【参考方案1】:

你必须将Logs数组序列化成json并发送回客户端

app.get('/logs',function(req,res)
    res.setHeader('Content-Type', 'application/json');
    res.send(JSON.stringify(readDirectory.readDirectory()));
);

或者

app.get('/logs',function(req,res)
    res.json(readDirectory.readDirectory());
);

【讨论】:

我仍然没有看到数据,我不知道为什么 尝试使用网络浏览器访问JSON?或者你可以试试console.log(response) 我认为首先我没有从readDirectory.jsapp.js 获取数据,出于某种原因我对其进行了调试,我在readDirectory 函数的日志数组中看到了4 个项目,但它没有被传递给app.js 你在app.js中调试var readDirectory = require('./readDirectory');这行了吗 Server.connections property is deprecated. Use Server.getConnections method instead. 它正在调用函数 readDirectory 但它没有返回任何内容【参考方案2】:

您的 readDirectory.js 应如下所示:

var fs = require('fs');
var path = './Logs'
var Logs = [];
function readDirectory(callback)
    fs.readdir(path, function(err, items) 
       Logs.push(items);
       callback(Logs);       
    ); 

exports.readDirectory = readDirectory;

你的 app.js 应该是这样的:

var express = require('express');
var app = express();
var readDirectory = require('./readDirectory');
app.use(express.static(__dirname + "/public"));

app.get('/logs',function(req,res)
    readDirectory.readDirectory(function(logFiles)
       res.json(files : logFiles);
   );
);

希望得到帮助!

【讨论】:

【参考方案3】:

从 Node v11.0.0 开始,您可以使用require('fs').promises 来获得承诺。

在您的情况下,您将目录中的文件数组推送到“日志”数组中。由于在这种情况下,“Logs”将始终是一个只有一个值的数组,所以我没有使用它。

你可以这样做:

var fs = require('fs').promises;
var path = './Logs'
async function readDirectory() 
    const files = await fs.readdir(path);
    return files;

为了返回文件夹中的文件列表,请像这样更改您的 app.js:

app.get('/logs', function (req, res) 
    readDirectory.readDirectory()
        .then((files) => 
            res.send(files);
        );
);

完整答案的链接: https://***.com/a/56821924/8021938

来源: https://nodejs.org/api/fs.html#fs_fspromises_readfile_path_options

【讨论】:

@m02ph3u5 我刚刚添加了这个案例的答案,希望对您有所帮助。

以上是关于如何从目录中读取文件并作为 JSON 发送给客户端?的主要内容,如果未能解决你的问题,请参考以下文章

小记---------maxwell 一个可以实时读取mysql二进制日志binlog,并生成JSON格式的消息,作为生产者发送给kafka,Redis,文件或其他平台的应用程序

java后端怎么发送json文件给客户端?

Vue.js - 如何将 prop 作为 json 数组传递并在子组件中正确使用?

如何从 JSON 文件中向用户发送消息?

从字节读取视频

如何使用filebeat读取json文件并通过logstash发送到elasticsearch