如何在Ember CLI中使用自定义Express服务器?

cwa*_*rny 16 ember-cli

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

更新:

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

app-name/app/adapters/application.js:

import DS from 'ember-data';

export default DS.RESTAdapter.reopen({ namespace: 'api' });
Run Code Online (Sandbox Code Playgroud)

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

app-name/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);
Run Code Online (Sandbox Code Playgroud)

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

app-name/app/routes/index.js:

import Ember from 'ember';

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

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

ember serve --proxy http://localhost:8147/
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

cwa*_*rny 19

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

创建文件夹结构

ember new my-app
Run Code Online (Sandbox Code Playgroud)

进入新创建的文件夹

cd my-app
Run Code Online (Sandbox Code Playgroud)

生成api-stub*(参见更新)

ember generate api-stub my-server
Run Code Online (Sandbox Code Playgroud)

后一个命令创建一个包含server文件的index.js文件夹和一个包含文件的routes文件夹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);
};
Run Code Online (Sandbox Code Playgroud)

您需要做的就是更改该文件.如果Ember应用程序拨打/api/hamsters/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);
};
Run Code Online (Sandbox Code Playgroud)

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

ember server
Run Code Online (Sandbox Code Playgroud)

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


更新

截至Ember CLI 0.0.41(通过此PR)api-stub已重命名http-mock.

  • 截至Ember CLI 0.0.41([通过此PR](https://github.com/stefanpenner/ember-cli/pull/1530))`api-stub`已重命名为`http-mock`. (10认同)
  • 请注意,来自ember-cli文档:`注意:模拟仅用于开发和测试.在ember构建过程中将忽略整个/ server目录 (6认同)