【问题标题】:ember-cli mocks doesn't return single recordember-cli 模拟不返回单个记录
【发布时间】:2015-07-15 16:39:23
【问题描述】:

我正在构建一个简单的 ember-cli 应用程序。我尝试实现新的模拟功能。

server/mocks/users.js

module.exports = function (app) {
  var express = require('express');
  var usersRouter = express.Router();
  usersRouter.get('/', function (req, res) {
    res.send({"users": [
      {
        "id": 1,
        "login": 'berdof'
      },
      {
        "id": 2,
        "login": 'berdof2'
      }
    ]});
  });
  app.use('/api/users', usersRouter);
};

接下来当我尝试获取数据时,例如在浏览器中,我只是打开

http://0.0.0.0:4200/api/user/

并获得正确的数据。但是当我想获取一条记录时,它只会给我一个错误

Cannot GET /api/users/1

你知道这是为什么吗?我已经与这个错误战斗了大约 2 个小时。 谢谢你的帮助!祝你有美好的一天!

更新

这是根据@kaungst 帖子修改后的答案:

module.exports = function (app) {
  var express = require('express');
  var router = express.Router();
  var dataToSend = [
    {
      id: 1,
      login: 'berdof',
    },
    {
      id: 1,
      login: 'berdof2'
    }
  ];

  router.get('/', function (req, res) {
    res.send({"users": dataToSend});
  });
  router.get('/:id', function (req, res) {
    var id = req.params.id;
    res.send({"user": dataToSend[id]});
  });
  app.use('/api/users', router);
};

【问题讨论】:

    标签: ember.js ember-data ember-cli


    【解决方案1】:

    你必须创建一个额外的模拟来处理这种情况

    对于这个特定的例子运行

    ember g http-mock user
    

    应该在 /server/mocks/user.js 中生成以下内容

    module.exports = function (app) {
        var express = require('express');
        var userRouter = express.Router();
        userRouter.get('/', function (req, res) {
            res.send({"user": []});
        });
        app.use('/api/user', userRouter);
    };
    

    把它改成这样

    module.exports = function (app) {
        var express = require('express');
        var userRouter = express.Router();
        userRouter.get('/', function (req, res) {
            // this part is hacky but works
            // main thing is to decide what you want to send
            // happy to update if someone knows a better solution
            var url = req.baseUrl.split('/');
            var id = parseInt(url[url.length-1]);
            var users = [{
                "id": 1,
                "login": 'berdof'
                },
                {
                "id": 2,
                "login": 'berdof2'
            }];
    
            res.send({"user": users[id]});
        });
        app.use('/api/user/:id', userRouter);
    };
    

    【讨论】:

    • 谢谢!不错的解决方案!我正在考虑类似的事情,但认为可以在 ember-cli 中完成此操作。我调整了您的代码,使其现在可以返回单记录和复数。如果您有关于改进我的代码的想法,我想听听!
    • 你如何处理这个问题,你,f.e.想要获取模型中的第一个 json 对象,并且会直观地将 1 设置为路由中的必需参数,但是在 http-mock 发送命令 res.send({"user": users[id]}); 中,您将不会自动获取第一个对象,而是第二个对象,因为users 被创建为一个数组,users[1] 将返回 id 为 2 的对象(至少在上述 @AlexBerdyshev 的实现中)。我现在在我的用例中用var id = req.params.id -1; 解决了这个问题,但它有点hacky。有没有更“余烬”的方式来做到这一点?
    【解决方案2】:

    http-mocks 的更好替代品

    我建议使用ember-cli-mirage 进行客户端开发和测试。 项目网站提供了足够详细的文档

    好处

    • 它创建了一个支持所有 CRUD 操作的内存数据库。
    • 对开发和测试使用相同的数据。
    • faker.js 很好地集成以创建随机数据。
    • 能够创建固定装置。

    在使用 http-mocks 时遇到了困难,我强烈推荐它。

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 2012-08-28
      • 2015-10-17
      • 2018-12-08
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多