16

我正在使用 Ember CLI 0.0.36。当我ember server在我的项目文件夹中运行时,我的理解是埋在某些 Brocoli 进程中的服务器启动了。但是,我想编写一个自定义 Express 服务器,并让我的应用程序指向该 Node.js 代码作为其后端。我将如何在 Ember CLI 框架中执行此操作?

更新:

@user3155277 的回答之后,我添加了一个适配器文件,如下所示:

应用程序名称/应用程序/适配器/应用程序.js

import DS from 'ember-data';

export default DS.RESTAdapter.reopen({ namespace: 'api' });

我创建了一个 Express 服务器,并将其放在我的应用程序的根目录中:

应用程序名称/server.js

var express = require("express"),
    app = express(),
    path = require("path");

app.get("/api/test", function(req, res) {
    res.json({
        hello: "world"
    });
});

var server = app.listen(8147);

在 Ember 应用程序中,我的索引路由定义如下:

应用程序名称/应用程序/路由/index.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
        return Ember.$.getJSON("/api/test").then(function(data) {
            return data;
        });
    }
});

然后在命令行上启动服务器,如下所示:

ember serve --proxy http://localhost:8147/

我收到以下错误:

version: 0.0.35-master-86abdb11ba
Proxying to http://localhost:8147/
object is not a functionTypeError: object is not a function
    at Class.module.exports.Task.extend.start (D:\ember-cli\lib\tasks\server\express-server.js:41:43)
    at Class.module.exports.Task.extend.run (D:\ember-cli\lib\tasks\serve.js:40:23)
    at Class.module.exports.Command.extend.run (D:\ember-cli\lib\commands\serve.js:35:18)
    at Class.Command.validateAndRun (D:\ember-cli\lib\models\command.js:74:15)
    at CLI.<anonymous> (D:\ember-cli\lib\cli\cli.js:33:20)
    at tryCatch (D:\ember-cli\node_modules\rsvp\dist\commonjs\rsvp\-internal.js:163:16)
    at invokeCallback (D:\ember-cli\node_modules\rsvp\dist\commonjs\rsvp\-internal.js:172:17)
    at publish (D:\ember-cli\node_modules\rsvp\dist\commonjs\rsvp\-internal.js:150:13)
    at flush (D:\ember-cli\node_modules\rsvp\dist\commonjs\rsvp\asap.js:51:9)
    at process._tickCallback (node.js:419:13)Livereload server on port 35729
4

2 回答 2

19

使用 Ember CLI 0.0.40 这实际上非常简单:

创建文件夹结构

ember new my-app

进入新创建的文件夹

cd my-app

生成 api-stub*(见更新)

ember generate api-stub my-server

后一个命令创建一个包含文件的文件serverindex.jsroutes一个包含文件的文件夹my-server.js

打开my-server.js文件,你会看到:

module.exports = function(app) {
    var express = require("express");
    var myServerRouter = express.Router();
    myServerRouter.get("/", function(req, res) {
        res.send({my-server:"something"});
    });
    app.use("/api", myServerRouter);
};

您需要做的就是更改该文件。如果 Ember 应用程序调用/api/hamstersand /api/project,编辑如下:

module.exports = function(app) {
    var express = require("express");
    var myServerRouter = express.Router();
    myServerRouter.get("/hamsters", function(req, res) {
        res.send({ ... });
    });
    myServerRouter.get("/project", function(req, res) {
        res.send({ ... });
    });
    app.use("/api", myServerRouter);
};

启动服务器(从项目的根目录):

ember server

确保您也已将 node.js 更新到最新版本。


更新

自 Ember CLI 0.0.41 起(通过此 PRapi-stub已重命名http-mock

于 2014-08-07T15:18:17.813 回答
3

我开始玩 ember cli,所以我不确定,但我发现了以下内容: https ://github.com/dockyard/ember-cli-plus-backend/tree/rails-served-html/frontend/api-stub 基本上您应该将您的快速服务器代理到与您的 ember-cli 相同的端口(这样您就不必处理 jsonp 问题)

将方法设置为“代理”并定义 proxyURL 以将所有 API 请求传递到代理 URL。

更新:

1.生成适配器ember generate adapter application

2.Make api命名空间 - 使用以下代码填充创建的文件:

导出默认 DS.RESTAdapter.reopen({ namespace: 'api' });

3.启动服务器ember serve --proxy http://localhost:1337/(这会将您的所有请求代理到 localhost:4200 到 1337

4.在您的快递应用程序中制作以/api为前缀的路线

希望能帮助到你

于 2014-06-26T10:05:04.883 回答