【问题标题】:How to send a json file from node to angularjs如何将json文件从节点发送到angularjs
【发布时间】:2016-02-16 03:53:42
【问题描述】:

我想要做的是将我网站的所有静态文件保存在我想以角度读取的 json 文件中,我正在考虑两种方法:

  1. 直接从AngularJS调用一个json文件
  2. 将 json 文件从节点发送到 AngularJS

我不知道该怎么做,我已经尝试过第二种方法(没有运气):

Nodejs 代码:

app.get( '/content', function ( require, response ) {
    response.setHeader('Content-Type', 'application/json');
    response.json( readJSONFile( './client/content.json', function ( err, json ) {
            if ( err ) {
                throw err;
            }
            console.log( json );
        } )
    )
} );

function readJSONFile( filename, callback ) {
    require( "fs" ).readFile( filename, function ( err, data ) {
        if ( err ) {
            callback( err );
            return;
        }
        try {
            callback( null, JSON.parse( data ) );
        } catch ( exception ) {
            callback( exception );
        }
    } );
}

当我访问localhost:3000/content 并在浏览器上检查网络时,文件已发送,但在预览选项卡中看不到数据,不确定我做错了什么......

另外,我如何在 AngularJS 中创建服务以从服务器获取这些数据?

【问题讨论】:

    标签: json angularjs node.js


    【解决方案1】:

    因此,您的问题可以分解为 2 个(相当)独立的问题。让我们一个一个来:

    1。如何从 Node.js 应用程序提供 json 文件

    您的代码不起作用的原因是您以“错误的顺序”执行它。您的readJSONFile 函数是一个asynchronous 函数,其中json 文件的内容仅在一段时间后 可用,此时Node 的readFile 函数的回调块被调用。在这里,您尝试使用readJSONFile立即返回值 作为response.json 的参数,这意味着undefined。这就是为什么您在预览选项卡中看不到任何数据的原因。

    解决办法:

    一个。为简单起见,您可以改用readFileSync

    app.get( '/content', function ( request, response ) {
        response.json( require('fs').readFileSync('./client/content.json', 'utf8') );
    }
    

    b.或者按照 Node.js 的异步签名(也是一种更好的做法)来生活,您可以这样做:

    app.get( '/content', function ( request, response ) {
        readJSONFile( './client/content.json', function ( err, json ) {
            if ( err ) {
                throw err;
            }
            return response.json( json );
        } );
    } );
    

    我建议您在 Google 上搜索 readFilereadFileSync,以便对这些原生 Node.js API 有更深入的了解。无论哪种方式,这两种方法都应该在控制台预览选项卡中为您提供一些数据。现在剩下的就是下一个问题了:

    2。如何从 AngularJS 向 HTTP 端点发出请求

    说实话,这是一个相当“大问题”,不是因为它很难或太复杂无法解释,而是因为有很多不同的方法可以做到这一点。快速的答案是告诉你使用 Angular 的原生 $http 服务,或 ngResource,或多功能 Restangular;虽然我可以在这篇文章中继续讨论这些内容,但我认为 StackOverflow 上关于这个主题的答案要好得多,例如 this one

    再次,我个人建议您对上述 3 个关键字进行更多研究。如果事后看起来仍然很模糊,您可能总是会回到这里并提出更详细的问题,例如:“我如何使用 <NAME> 从 AngularJS 向服务器发出 HTTP 请求”,<NAME>$httpngResourceRestangular,我(或任何其他活跃用户)将非常乐意回答!

    【讨论】:

    • 你的代码和简单的var content = require('path/to/content.json');有什么区别,然后创建端点app.get( '/api/v1/content', function ( require, response ) { response.setHeader( 'Content-Type', 'application/json' ); response.json( content ); } );
    • require(...) 用于声明使用另一个 nodejs 模块(如文档中的here),因此不能用于读取文件系统上文件的内容。我上面的代码不同之处仅在于我使用了readFileSync,而不是require
    • @JonathanS。确实有效。感谢您指出这一点,所以我现在知道还有另一种读取 json 文件的方法。然而,readFilereadFileSync 可能是更好的做法,正如 here 所讨论的那样,因为显然require 会缓存文件的内容,所以当您需要更新 json 文件时,您可能会遇到一些不必要的开销.
    • 使用solution a时出现以下错误:require is not a function
    • 我的错。 require 语句被上述参数名称屏蔽(来自您的原始代码)。我更改了原始答案,以便将参数命名为request。现在require('fs') 应该可以按预期工作。让我知道它是否适合你!
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2022-11-04
    • 2013-06-26
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2023-03-10
    相关资源
    最近更新 更多