2

我在从 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 单独工作,但是当我尝试在我的节点服务器中呈现它时,我得到错误,我的节点服务器中的代码在 express 中:

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数据调用以避免错误,没有别的办法吗?

4

2 回答 2

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 模板中,您必须将通道直接呈现到页面中。

于 2012-11-15T16:08:19.773 回答
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);
    });
  }
});
于 2012-11-15T16:11:31.360 回答