Node.js调用json数据

时间:2012-11-15 15:55:41

标签: javascript json node.js express

我从json文件获取json数据时遇到一些问题,首先是错误: "NetworkError: 404 Not Found - http://localhost:8000/channels.json"

以下是在我的html文件中获取json数据的代码:

      <div id="result"></div>
      <script type="text/javascript">
    // read episodes in channel
    function ajaxRequest(){
        if (window.XMLHttpRequest) // if Mozilla, Safari etc
            return new XMLHttpRequest();
        else
            return false;
    }

    var mygetrequest=new ajaxRequest();
    mygetrequest.onreadystatechange=function(){
        if (mygetrequest.readyState==4){
            if (mygetrequest.status==200 || window.location.href.indexOf("http")==-1){
                var jsondata=eval("("+mygetrequest.responseText+")"); //retrieve result as an JavaScript object
                var rssentries=jsondata.channels;
                var output='<ul>';
                for (var i=0; i<rssentries.length; i++){
                    output+='<li>';
                    output+=rssentries[i].channel_id+'</a><br>';
                    output+='<a href="multiroom.html">'+rssentries[i].name+'</a>';
                    output+='</li>';
                }
                output+='</ul>';
                document.getElementById("result").innerHTML=output;
            }else{
                alert("An error has occured making the request");
            }
        }
    }

    mygetrequest.open("GET", "channels.json", true);
    mygetrequest.send(null);

    </script>

所以html单独工作,但当我尝试在我的节点服务器中渲染它时,我得到错误,代码在我的节点服务器中表达:

var express = require('express');
var http = require('http'); 
var app = express();
var server = module.exports = http.createServer(app);

server.listen(8000);
console.log("Express server listening on port 8000 in %s mode");

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

app.get('/episodes', function(req, res){
    res.render('episodes.html');
});

所以我必须在服务器中进行json数据调用以避免错误,没有别的办法吗?

2 个答案:

答案 0 :(得分:2)

如果您在服务器上呈现,则无法使用Ajax。 Ajax只能在浏览器中运行,而不是在服务器上运行。在服务器上,您必须直接读取文件,将其传递给渲染器,并在模板内部渲染它。例如:

var fs = require('fs');
app.get('/episodes', function(req, res){
    fs.readFile('./public/channels.json', 'utf8', function (err, data) {
        var channels = JSON.parse(data);
        res.render('episodes.html', channels);
    });
});

在您的ejs模板中,您必须直接将频道渲染到页面中。

答案 1 :(得分:0)

与Max建议的另一个选择是使用res.format()返回所需的特定内容类型。

http://expressjs.com/api.html#res.format

res.format({
  text: function(){
      res.send(...);
  },
  html: function(){
      res.send(...);
  },
  json: function(){
    fs.readFile('./public/channels.json', 'utf8', function (err, data) {
        var channels = JSON.parse(data);
        res.send(channels);
    });
  }
});