3

我用 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");
});

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

4

2 回答 2

2

几点评论:

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('/').

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

http://localhost:8080

4)我不确定 SQL 查询返回的结构,但确保结果与 Ember-data 期望的完全一样,在您的具体示例中,它应该导致:

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

希望它有帮助,幸运。

于 2013-07-30T15:27:45.703 回答
0

是的,你是对的,这是 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')
});
于 2013-07-30T18:13:08.940 回答