Ember从NodeJS获取MongoDB中的数据

时间:2018-04-23 12:26:54

标签: node.js mongodb ember.js ember-data

我有一个MongoDB服务器,它有一个与之交互的NodeJS服务器。我希望Ember Store从这台服务器获取数据。一个教程引导我直到这一点,但它对我不起作用(tutorial),我认为它已经过时但我不确定。 后端服务器的这一部分是关于发送数据:

app.get('/api/appointments', function(req, res){
    AppointmentModel.find({}, function(err, docs){
        if(err) res.send({error:err});
        else res.send({data:docs, "type":"appointment"});
    });
});

curl请求证明它确实有效:

curl http://localhost:4500/api/appointments
{"data":[{"flags":[],"dates":[],"invited":[],"_id":"5adc8b6724a69f4327c4c7af","author":7,"title":"Does this work"}],"type":"appointment"}

这是向服务器发出请求的余烬代码的一部分:

export default Route.extend({
    model: function(){
        return this.store.findAll('appointment');
    }
});

这是我在webbrowser(chrome)控制台中遇到的错误:

Error while processing route: index Assertion Failed: Encountered a resource object with an undefined type (resolved resource using (unknown mixin)) Error: Assertion Failed: Encountered a resource object with an undefined type (resolved resource using (unknown mixin))
    at new EmberError (http://localhost:4200/assets/vendor.js:24475:25)
    at Object.assert (http://localhost:4200/assets/vendor.js:24725:15)
    at Class._normalizeResourceHelper (http://localhost:4200/assets/vendor.js:85052:61)
    at Class._normalizeDocumentHelper (http://localhost:4200/assets/vendor.js:84993:25)
    at Class._normalizeResponse (http://localhost:4200/assets/vendor.js:85121:36)
    at Class.normalizeArrayResponse (http://localhost:4200/assets/vendor.js:86013:19)
    at Class.normalizeFindAllResponse (http://localhost:4200/assets/vendor.js:85873:19)
    at Class.normalizeResponse (http://localhost:4200/assets/vendor.js:85816:23)
    at normalizeResponseHelper (http://localhost:4200/assets/vendor.js:76037:39)
    at promise.then.adapterPayload (http://localhost:4200/assets/vendor.js:76889:19)

因为错误是类型的问题,我检查并再次检查模型,但没有发现任何会产生错误的内容。 烬:

export default DS.Model.extend({
    author: DS.attr('number'),
    title: DS.attr('string'),
    description: DS.attr('string'),
    flags: DS.hasMany('number'),
    dates: DS.hasMany('date'),
    invited: DS.hasMany('number')
});

的NodeJS /蒙戈:

//The schema for appointments
var appointmentSchema = new mongoose.Schema({
    author: Number, //Userid of the owner of the appointment.
    title: String,
    description: String,
    flags: [Number], //Array of ids of flags that are set.
    dates: [Date],
    invited: [Number] //Array of user ids.
});
var AppointmentModel = mongoose.model('appointment', appointmentSchema);

ember以什么特殊方式需要数据才能正确处理它?<​​/ p>

我已经阅读了一些关于存储和余烬的文档,但我仍然是框架的新手,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

首先,您需要了解ember数据模型定义。这没有意义:

flags: DS.hasMany('number'),

这基本上意味着*约会有多个标志,它们属于模型number。您不能将hasManybelongsTo用于数组或基本类型。

现在你有两个选择。您可以为标志,人员(邀请)等创建模型,也可以返回简单的JSON结构。为此指定attr()(没有给出参数)。

您的下一个问题是,默认情况下,ember会假定为jsonapi,但您并未发送jsonapi。您可以在此处移至服务器上的jsonapi,也可以将serializer修改为here

然而考虑到所有这些,我得出结论,你可能根本不想使用ember-dataember-data对于具有关系且基于模型的数据非常有用,但如果没有它,则可以使用ember

你可以这样做:

model() {
  return $.getJSON('/api/appointments');
}

然后按照您要发送的普通JSON进行操作。

如果您想使用ember-data或完全取决于您的使用案例。

答案 1 :(得分:0)

从我可以看到你使用错误的适配器,你的后端正在使用JSONAPI规范http://jsonapi.org/,但是ember期待REST,这就是type属性失败的原因,你只需要更改适配器从REST到JSONAPI,在这里你可以找到更多信息https://guides.emberjs.com/v3.0.0/models/customizing-adapters/在你的情况下它应该非常简单只需将适配器更改为JSONAPIAdapter