【问题标题】:Fetching API data from Ember Controller从 Ember 控制器获取 API 数据
【发布时间】:2015-06-21 06:17:38
【问题描述】:

我是 Ember 新手,正在尝试创建一个简单的应用程序来从 API 服务器获取记录。

目前我正在尝试查询

 this.store.find('validemail',{'email':'abc.gmail.com'}).then(function(response){
    console.log(response);
  });

//控制台登录浏览器

Class {query: Object, store: Class, manager: Class, isLoaded: true, meta: Object…}__ember1434866946710: "ember592"__ember_meta__: Object__nextSuper: undefinedcontent: (...)get content: GETTER_FUNCTION() {set content: SETTER_FUNCTION(value) {isLoaded: truemanager: Classmeta: Objectquery: Objectstore: Classtype: client@model:validemail:__proto__: Class

这是很多数据,但我无法理解它,我想要的只是成功:true 或成功:来自服务器 API 的方法。

这是我的模型类 从“ember-data”导入 DS;

export default DS.Model.extend({
  success:DS.attr('boolean'),
  message: DS.attr('string')

});

和 API 方法

router.get('/validemails',function(req,res){
   console.log(req.query);
   var useremail=req.query.email;
   Hiveuser.find({'useremail':useremail},function(err,findResponse){
      if(!isEmptyObject(findResponse)){

          res.send({"validemail": {success: false,'message': 'User Already Exists'}});
      }
      else{
          res.send({"validemail": {success: true,'message':''}});
      }
   });


});

我意识到我做错了,因为 Ember Inspector 显示模型类的 0 条记录。

我没有得到的是记录服务器响应表明正确的响应是从服务器发送的,但不知何故它被破坏成这个乱码进入客户端。

注意:我什至不打算在这个简单的用例中使用 Ember 模型,但是发送 jQuery GET 请求需要我将服务器 IP 硬编码到控制器中,因此必须走适配器“路由”(没有双关语:) )

如果有一种方法可以从控制器发送 JSON 请求,该请求将从适配器获取服务器 ip,我非常想知道它。

谢谢

【问题讨论】:

  • 所以你确实看到记录是从服务器返回的,比如 chrome 检查器?
  • 是的 Chrome 检查器显示了一些响应,但我似乎无法在任何地方找到从服务器返回的 json。 Class {query: Object, store: Class, manager: Class, isLoaded: true, meta: Object…}__ember1434866946710: "ember592"__ember_meta__: Object__nextSuper: undefinedcontent: (...)get content: GETTER_FUNCTION() {set content: SETTER_FUNCTION(value) {isLoaded: truemanager: Classmeta: Objectquery: Objectstore: Classtype: client@model:validemail:__proto__: Class
  • 你能把服务器返回的json贴出来吗? Ember 对您发送的内容寄予厚望。
  • {'validemail': {success: true,'message':''}}这是服务器发过来的响应json
  • 对此我不是 100%,但我相信 ember 希望您将记录作为对象数组返回。例如,{"validemail": [{"success": true, "message": ""}]}。如果单独添加数组不起作用,您也可以尝试将对象键(成功)放在引号中。您要查找的是显示在 ember 检查器中的数据。之后你就可以处理数据了。

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


【解决方案1】:

首先,当您执行store.find('modelName') 时,Ember REST API 适配器需要一组模型作为响应。然后,store.find 的 promise 将解析为对象数组,并且您必须获取第一个对象以查看 success === true 是否。

this.store.find('validemail', {'email':'abc.gmail.com'}).then(function(validEmails){
  console.log(validEmails.get('firstObject.success')); // true || false
});

API方法:

router.get('/validemails',function(req,res){
   console.log(req.query);
   var useremail=req.query.email;
   Hiveuser.find({'useremail':useremail},function(err, findResponse){
      if(!isEmptyObject(findResponse)){
        res.send({"validemails": [{success: false, 'message': 'User Already Exists'}]});
      }
      else {
        res.send({"validemails": [{success: true, 'message':''}]});
      }
   });
});

【讨论】:

  • 感谢并在 json 响应中为 _id 实现序列化修复了它! :) 我已经为此苦苦挣扎了太久了
【解决方案2】:

下面一行

.then(function(response) { console.log(response); })

正在“吃掉”响应。您需要从中返回 response 以将其沿 Promise 链向下传递,然后传递给 Ember 以将其设置为模型:

this.store.find('validemail',{'email':'abc.gmail.com'}).then(function(response){
    console.log(response);
    return response;
});

或者可能更好,做一个单独的then

var response = this.store.find('validemail',{'email':'abc.gmail.com'}); 
response.then(function(response) { console.log(response); });
return response;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多