Ember.js 余烬cli模拟不';不返回单个记录

Ember.js 余烬cli模拟不';不返回单个记录,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我正在构建一个简单的ember cli应用程序。我试图实现新的mocks特性 server/mocks/users.js module.exports = function (app) { var express = require('express'); var usersRouter = express.Router(); usersRouter.get('/', function (req, res) { res.send({"users": [ {

我正在构建一个简单的ember cli应用程序。我试图实现新的mocks特性

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 post修改的答案:

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 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);
};

http模拟的更好替代方案

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);
};
我建议在客户端开发和测试中使用。 项目网站提供了足够详细的文档

好处

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);
};
  • 它创建一个支持所有CRUD操作的内存db
  • 在开发和测试中使用相同的数据
  • 与很好地集成以创建随机数据
  • 能够创建装置

在努力使用http模拟之后,我强烈推荐它。

谢谢!很好的解决方案!我也在考虑类似的事情,但我认为在ember cli中也可以这样做。我调整了你的代码,现在它可以返回单记录和复数。如果你有改进我的代码的想法,我想听听!您如何处理这个问题,例如,您希望获取模型中的第一个json对象,并直观地将
1
设置为路由中的必需参数,但是在http mock send命令
res.send({“user”:users[id]})中
您将不会自动获取第一个对象,而是第二个对象,因为
users
被创建为一个数组,
users[1]
将返回id为2的对象(至少通过上面@AlexBerdyshev的实现)。我现在用
varid=req.params.id-1解决了这个问题在我的用例中,但它有点粗糙。有没有一个更“余烬”的方式来做到这一点?