2

运行这段代码给了我这个错误,一个小时后试图弄清楚但失败了

var http = require('http');
var url = require('url');
var fs = require('fs');
var port = 3010;

http.createServer(function(req, res){
    var query = url.parse(req.url,true).query;
    console.log(query);
    var file = query.f + query.t;
    //var file = "eurusd_m1.json";  
    console.log(file);
    var eurusd;
    fs.readFile('data/' + file + '_m1.json', function(err,data){
        if (err){
            console.log(err);
        }           
        eurusd = JSON.parse(data);
        console.log(eurusd);
    });
    res.writeHead(200,{'content-type':'text/plain'});
    res.end("helllo owrld");    
}).listen(port);

console.log("server running at port 3010..");

它给了我以下结果:


server running at port 3010..
{ f: 'eur', t: 'usd' }
eurusd
{}
NaN
{ [Error: ENOENT, open 'C:\Users\Administrator\Documents\zeromq\data\NaN_m1.json']
  errno: 34,
  code: 'ENOENT',
  path: 'C:\\Users\\Administrator\\Documents\\zeromq\\data\\NaN_m1.json' }

undefined:1
undefined
^
SyntaxError: Unexpected token u
    at Object.parse (native)
    at C:\Users\Administrator\Documents\zeromq\dataserver.js:17:17
    at fs.js:207:20
    at Object.oncomplete (fs.js:107:15)

4

1 回答 1

2

您看到的是客户对favicon.ico. 这里执行了两个请求(因此,您会看到两次日志)。浏览器要求页面favicon.ico 文件,该文件代表您在添加书签时看到的小图标,位于地址栏的左侧 :)

您的问题出在var file = query.f + query.t;- 这在您访问页面时有意义,但在您的浏览器隐式访问 favicon.ico 时没有意义。

您只是在console.log输入错误而不是从错误中返回,这意味着您 JSON.parse 在一个未定义的值上 - 这会引发规范中定义的语法错误(只需尝试打开控制台并在其中键入 JSON.parse(window.x)你的浏览器)

(当它尝试打开时,您可以通过 ENOENT 看到它"NaN_m1.json"

您可以在调用之前将其添加到您的服务器url.parse,但如果您打算使其更大 - 正确的路由可能会更好:

if (req.url === '/favicon.ico') {
    r.writeHead(200, {'Content-Type': 'image/x-icon'} );
    return r.end();
}
于 2013-09-15T22:21:16.990 回答