【问题标题】:Use Node.js to create an API for Ember使用 Node.js 为 Ember 创建 API
【发布时间】:2013-07-30 14:12:13
【问题描述】:

我用 Express.js 为 Ember.js 制作了一个 API,当我 curl 一切正常但在 Ember 应用程序上我遇到了一些奇怪的错误:

这是我的 Node.js 应用代码:

var express = require('express'), http = require('http');
var app = express();
var mysql = require('mysql');

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'blog-api'
});


connection.connect();

app.get('/', function(req, res) {
    res.end('/');
});

app.get('/posts', function(req, res) {
    connection.query('SELECT * FROM posts', function(err, rows, fields) {
        res.send(JSON.stringify({
            posts: rows
        }), 200);
    });
});




http.createServer(app).listen(8080, function(){
  console.log("Express server listening on port 8080");
});

你认为错误来自哪里? 感谢您的帮助。

【问题讨论】:

  • 作为一个开始,你为什么不尝试调试错误呢?例如:function(err, rows, fields) { if (err) { console.error(err); } }
  • 我尝试了您的解决方案,但没有打印任何内容,因此错误不在节点端,我将发布我的 ember 代码

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


【解决方案1】:

几个cmets:

1) 您可能有以下拼写错误:

App.Post = DS.Model.extend({
    titre: DS.attr('string'),

如果您的查询返回此属性,则它应该是 title

2) 你有:

app.get('/', function(req, res) {
    res.end('/');
});

nodejs 不会让您执行跨源查询,并且您的节点代码不提供客户端文件(Ember/js/etc...),所以:

允许跨域策略,您可以通过以下方式执行此操作:

app.use(function (req, res, next) {
        res.header("Access-Control-Allow-Origin", req.header('origin'));
        res.header("Access-Control-Allow-Headers", "X-Requested-With");

        next()
})

或者通过res.render而不是res.end('/')提供您的html文件。

3) 如果外部提供的客户端文件最好将 URL 更改为完整路径,例如:

http://localhost:8080

4) 我不确定 SQL 查询返回的结构,但请确保结果完全符合 Ember-data 的预期,在您的具体示例中,它应该会产生:

{"posts":[{"title":"Post1"},{"title":"Post2"}]}

希望对你有帮助,幸好。

【讨论】:

  • 非常感谢!错误只是我的 REST 适配器的 url,我将 localhost:8080 替换为 http://localhost:8080 并且它可以正常工作。
【解决方案2】:

是的,你是对的,这是 Ember.js 代码:

EmberDemo.Router.map(function () {
  this.resource('posts', function(){
    this.resource('post', {path: '/:post_id'});
  });
  this.route('about');
});


EmberDemo.Store = DS.Store.extend({
  revision: 12,
  adapter: DS.RESTAdapter.extend({
    url: 'localhost:8080'
  })
});

EmberDemo.PostsRoute = Ember.Route.extend({
    model: function() { 
        return EmberDemo.Post.find();
    }
});

EmberDemo.Post = DS.Model.extend({
    titre: DS.attr('string'),
    description: DS.attr('string'),
    contenu: DS.attr('contenu')
});

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2021-01-13
    • 2019-11-19
    • 2021-07-04
    相关资源
    最近更新 更多