无法阅读财产' map'在sequelize nodejs中未定义

时间:2018-03-15 04:04:33

标签: arrays json node.js object

这是我的 api

exports.getService = function(req, res) {
    var limit = 10; // number of records per page
    var offset = 0;
    Service.findAndCountAll({
        raw: true,
        where: {

            shop: req.user.shop
        }
    }).then((data) => {
        var page = req.params.page; // page number
        var pages = Math.ceil(data.count / limit);
        offset = limit * (page - 1);
        Service.findAll({
            // raw: true,
            limit: limit,
            offset: offset,
            $sort: {
                id: 1
            },
            where: {
                shop: req.user.shop
            },
            include: [{
                model: Categoryservice,
                attributes: ['id'],
                include: [{
                    model: Category,
                    attributes: ['id', 'name'],
                }]
            }],
        }).then(function (services) {
            var services=JSON.parse(JSON. stringify(services));
            console.log('=====stringify==========>>',services);
            var arr = services.categoryservices.map(item => item.category.id)
            services.cats = arr;
            delete services.categoryservices;

            console.log('only for the testing========>',services);

            res.status(200).json({
                'result': services,
                'count': data.count,
                'pages': pages
            });
        });
    }).catch(function(error) {
        res.status(500).send('Internal Server Error');
    });
};

我在最后使用地图功能, 它包含服务器中未定义的错误映射.. 我想要一个像下面给出的json使用map功能。 其实我需要这个:

{
  "id": 2,
  "service": "mobile",
  "min": "20",
  "per": "10",
  "tax": "1",
  "cats": [
    1,
    2
  ]
}

我的JSON。 stringify(services)输出是:

=====stringify==========>> [ { id: 2,
    username: null,
    name: null,
    image: null,
    service: 'mobile',
    shop: '$2a$10$NWpbmgtzQAxRZ1ugvdC7LOlorBU36xoGHm1L.k.KmFqDO/7oSmBLu',
    min: '20',
    per: '10',
    tax: '1',
    activity: null,
    createdAt: '2018-03-14T07:30:57.000Z',
    updatedAt: '2018-03-14T07:30:57.000Z',
    categoryservices: [ [Object], [Object] ] },
  { id: 1,
    username: 'sam',
    name: 'New Service',
    image: '/images/uploads/22-Feb-2018/f96334384cd78754454c5e4e05e20fc0-dragon_pattern_red_black_9666_1920x1080.jpg',
    service: 'battery',
    shop: '$2a$10$NWpbmgtzQAxRZ1ugvdC7LOlorBU36xoGHm1L.k.KmFqDO/7oSmBLu',
    min: '5',
    per: '1',
    tax: '1',
    activity: '2018-03-14T06:01:36.000Z',
    createdAt: '2018-03-14T06:01:36.000Z',
    updatedAt: '2018-03-14T06:01:36.000Z',
    categoryservices: [] } ]

我是初学者使用地图功能, 所以,我在地图上很困惑,  所以请解决这个问题。

2 个答案:

答案 0 :(得分:0)

您正在对返回的阵列进行字符串化。如果您计划在其上使用.map,则无法执行此操作。删除该代码,然后重试。

.then(function (services) {
        var arr = services.categoryservices.map(item => item.category.id)
        services.cats = arr;
        delete services.categoryservices;

        console.log('only for the testing========>',services);

        res.status(200).json({
            'result': services,
            'count': data.count,
            'pages': pages
        });
    });

我认为我们遗漏了一些东西,因为您粘贴的输出没有您从传入map的项目返回的category.id属性。这是你想要的目标吗?这不是主题,但是这段代码可能不适用于你想要实现的目标,但会运行地图。

答案 1 :(得分:0)

看起来services是一个基于console.log的数组。如果你想要所有类别的id,你可以做

let categoryIds = [];
categoryIds = services.reduce((categoryIds, service) => {
  let ids = service.categoryservices.map(category => category.id);
  for(let id of ids) {
    if(categoryIds.indexOf(id) === -1) {
      categoryIds.push(id)    
    }
  }
  return categoryIds;
}, categoryIds);

如果您希望在每项服务中将类别ID设为cats,则可以执行

var services=JSON.parse(JSON. stringify(services));
services.forEach(service) => {
  service.cats = service.categoryservices.map(category => category.id);
  delete service.categoryservices;
});
res.status(200).json({
  'result': services,
  'count': data.count,
  'pages': pages
});

希望这有帮助!