Data.map不是一个功能

时间:2018-05-31 14:48:12

标签: javascript jquery json node.js

我正在尝试为学校项目建立一个网站。我设置了所有内容,但我得到了错误" Data.map不是函数"。 实际上,我不是专家,我只是想了解和复制老师给我们的代码(我们在node.js中几乎没有做任何事情)。

我使用node.js

构建了服务器
const express = require("express");
const app = express();
const process = require("process");
const bodyParser = require("body-parser");

let serverPort = process.env.PORT || 5000;

app.use(express.static(__dirname + "/public"));

app.set("port", serverPort);

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get('/doctors', function(req,res){
    var config = require('./doctor.json');
    res.send(JSON.stringify(config));
})

/* Start the server on port 3000 */
app.listen(serverPort, function() {
    console.log(`Your app is ready at port ${serverPort}`);
});

当我连接到医生页面时,我加载了所有医生的JSON文件,然后将其发送回客户端。这是JSON

[{
        "id": 0,
        "born": 2010,
        "tag": "cat",
        "name": "Eleanore"
    }, {
        "id": 1,
        "born": 2010,
        "tag": "dog",
        "name": "Katelin"
    }, {
        "id": 2,
        "born": 2012,
        "tag": "dog",
        "name": "Shea"
    }, {
        "id": 3,
        "born": 2011,
        "tag": "cat",
        "name": "Stephen"
    }, {
        "id": 4,
        "born": 2011,
        "tag": "cat",
        "name": "Rosanne"
    }, {
        "id": 5,
        "born": 2011,
        "tag": "cat",
        "name": "Alexa"
    }
]

然后我加载JSON,我想创建动态项目。这是我的客户端代码:

$.get('/doctors', function (data) {
    $("<div class='row' id='dottori' ></div>").appendTo(".team");

    data.map(addElement);
});

function addElement(doctor){
    console.log("Adding doctor");
    $("#dottori").append('<p> '+doctor.name+'</p>');

我一直收到这个错误,即使我将json文件字符串化(与我教授的相同),你可以在这里找到原始代码:https://bitbucket.org/polimi-hyp-2017-10173412/polimi-hyp-2018-project/src/master/

2 个答案:

答案 0 :(得分:1)

$.ajax()收到的数据及其任何包装方法都会以文字形式收到回复。如果要将此响应作为从json解析的对象进行处理,则必须执行以下操作之一。

您可以自己解析数据

var stuff = JSON.parse(data);

您可以自己手动解析它。

您可以让jQuery明确解析它

$.ajax({ url: ..., contentType: 'json' })

contentType参数提供值json将告诉jQuery响应应该是json,并且应该在将其提供给回调之前自动解析它。

你可以让jQuery隐式解析它

这是通过在响应上设置Content-Type: application/json来完成的。当jQuery获得响应时,它将检查此标头以尝试智能地猜测响应是什么并处理它。

根据此堆栈溢出帖子Proper way to return JSON using node or Express,您可以在节点中执行此操作...

res.setHeader('Content-Type', 'application/json');

答案 1 :(得分:1)

要映射json 对象 ... data必须是对象...不是字符串。

它是作为字符串收到的......所以你只需将其解析为一个对象。

在这里,它与.map()方法链接在一起:

JSON.parse(data).map(addElement);

但你可以做(​​同样的事情):

var dataObj = JSON.parse(data);
dataObj.map(addElement);

记住检查变量类型的有用技巧,由taplar提及:

console.log(typeof(variable-to-check));

typeof()是一个很好的调试技巧......有时需要在某些条件下使用它来避免错误(例如,如果脚本使用不同的源)。