使用JavaScript服务器端变量的未捕获语法错误

时间:2014-01-17 18:27:28

标签: javascript node.js

我在服务器端使用Node.Js,它生成一个JSON,我在一个Object中转换,我需要从客户端访问它,特别是从HTML页面中的脚本访问它。

编辑:服务器端代码

在服务器端,这是发布请求时的代码:

exports.plot = function(req, res){
    var json;
    request.post({
            uri:"http://127.0.0.1:8080/api/v1/datapoints/query",
            headers: {'Content-Type': 'application/json'},
            body:req.body.txt1
            },function (error, response, body) {
                if (!error && response.statusCode == 200) {

                    var json = JSON.parse(body); //JSON converted in an object
                    res.render('query', json);

                }
            }
        );

};

建议我使用服务器端脚本(如ASP.NET中使用的脚本)来访问该对象。

所以我使用了这种语法来获取我想要的值,但是在Chrome控制台上我得到了这个错误“Uncaught SyntaxError:Unexpeted token(”。

我哪里错了?

这是代码

<script>
 function(){
    var start = new Date();
        var queryLength = <%= queries.length %>, // This gives me a number correctly
        timestamps = [],
        tagsString = [],
        values = [],
        dataPoints = [];

        var metric = <%= queries[0].results[0].name %>; //Gives me correctly a string

    //il for che mi scorre tutta la risposta    
    for (var j = 0; j < queryLength; j++)
    {

    }
} 
</script>

完整的错误是:

Uncaught SyntaxError: Unexpected token ( jquery-1.9.1.js:603
(anonymous function) jquery-1.9.1.js:603
jQuery.extend.globalEval jquery-1.9.1.js:604
jQuery.fn.extend.domManip jquery-1.9.1.js:6187
jQuery.fn.extend.append jquery-1.9.1.js:5949
(anonymous function) jquery-1.9.1.js:6074
jQuery.extend.access jquery-1.9.1.js:852
jQuery.fn.extend.html jquery-1.9.1.js:6038
(anonymous function) format-timestamp.js:36
fire jquery-1.9.1.js:1037
self.fireWith jquery-1.9.1.js:1148
done jquery-1.9.1.js:8074
callback jquery-1.9.1.js:8598

3 个答案:

答案 0 :(得分:2)

该错误与JSON或服务器端代码无关。

语法错误在这里:

function(){

它看起来像是函数表达式的开头,但您没有将它用作表达式。它与函数声明的语法冲突,它看起来像这样:

function functionName(){

解析器希望函数的名称遵循function关键字,而是有一个括号。

如果要声明一个函数,应该有一个函数名。如果要使用函数表达式,则需要将其用作表达式,即:

(function(){
  ...
})();

我添加了()来实际调用该函数,否则只会创建该函数并将其抛弃而不调用它。

如果您想使用jQuery ready事件的简写,它看起来像这样:

$(function(){
  ...
});

编辑:

要在Javascript代码中重新创建对象或数组,必须使用文字语法在代码中打印它。您可以使用JSON,因为它是Javascript对象语法的一个子集。

伪代码(我不知道库node.js对于JSON有什么):

var queries = <% toJson(queries) %>;

答案 1 :(得分:1)

它看起来像是一个jquery错误..我认为你需要function(){}调用错误$(function() {});不要忘记在最后添加);

或者如果它不是您正在调用的Jquery ready函数,则会出现语法错误并且应该执行function myFunction(){}

试试这个

// replace `function(){}` width  `$(function() {});`
$(function() {
  var start = new Date();
        var queryLength = <%= queries.length %>, // This gives me a number correctly
        timestamps = [],
        tagsString = [],
        values = [],
        dataPoints = [];

        var metric = <%= queries[0].results[0].name %>; //Gives me correctly a string

    //il for che mi scorre tutta la risposta    
    for (var j = 0; j < queryLength; j++)
    {

    }
});

答案 2 :(得分:0)

问题是浏览器中的JavaScript无法将query的值理解为除字符串之外的任何内容。输出[1,2,3]{"foo":"bar"}无关紧要,JavaScript只会将其解释为var query = "[1,2,3]"var query = "{\"foo\":\"bar\"}"

正如Guffa在评论中所说:如果你想用JavaScript获取对象,你需要确保ASP输出对象的有效JSON字符串表示,然后在JavaScript中解析它。因此,如果ASP中的query对象为{foo: bar},则需要从ASP输出字符串"{\"foo\":\"bar\"}"。我不知道ASP是否有任何内置的方法,但假设它(或你做了一个),它被称为toJSONString():在你的JavaScript中,执行:

var query = JSON.parse(<%= toJSONString(query) %>)