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

Posted

技术标签:

【中文标题】如何在 Ember CLI 中使用自定义 Express 服务器?【英文标题】:How to use a custom Express server with Ember CLI? 【发布时间】:2014-08-11 17:30:12 【问题描述】:

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

更新:

在@user3155277's answer 之后,我添加了一个适配器文件,如下所示:

应用名称/app/adapters/application.js

import DS from 'ember-data';

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

我创建了一个 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);

在 Ember 应用中,我的索引路由是这样定义的:

应用名称/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;
        );
    
);

然后我在命令行上像这样启动服务器:

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

【问题讨论】:

Ember-cli 的迭代速度如此之快,但是 0.0.39 使这不那么痛苦。从命令行和繁荣生成一个 api-stub。你只需要 var express = require('express') 但在 0.0.40 中不会有。我之前在 api-stubs 上遇到过同样的问题 嘿@elrick,我等待 0.0.40 出来,但我仍然对如何设置整个事情感到很困惑。你能举个例子吗? 【参考方案1】:

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

创建文件夹结构

ember new my-app

进入新创建的文件夹

cd my-app

生成 api-stub*(查看更新)

ember generate api-stub my-server

后一个命令会创建一个带有index.js 文件的server 文件夹和一个带有my-server.js 文件的routes 文件夹。

打开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/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);
;

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

ember server

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


更新

自 Ember CLI 0.0.41 (via this PR) 起,api-stub 已重命名为 http-mock

【讨论】:

从 Ember CLI 0.0.41 (via this PR) 开始,api-stub 已重命名为 http-mock 请注意,来自 ember-cli 文档:Note: Mocks are just for development and testing. The entire /server directory will be ignored during ember build. 人们现在使用 Mirage 进行测试吗?【参考方案2】:

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

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

更新:

1.生成适配器ember generate adapter application

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

导出默认 DS.RESTAdapter.reopen( 命名空间:'api' );

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

4.在您的快速应用中创建以 /api 为前缀的路由

希望对你有帮助

【讨论】:

谢谢。会试一试,让你知道它是怎么回事。但是,在此之前,这可能是一个愚蠢的问题,你知道在投入生产时如何处理吗?使用代理听起来像是 hack。 我尝试实施您的建议。查看我编辑的问题以及我遇到的问题。 请尝试使用 0.0.37 的最新版本 对于黑客问题,此代理解决方法仅用于开发,您应该将 dist 目录中的文件用于您的 express 应用提供的生产服务器。 我使用 Node 后端而不是 Rails 制作了一个类似的 buildpack。我在开发过程中使用了代理,但在生产中使用了这个(它不代理任何东西)。 github.com/andrewbranch/heroku-buildpack-nodejs-ember

以上是关于如何在 Ember CLI 中使用自定义 Express 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

将LoDash与EmberCLI一起使用

如何在验收测试中模拟 Ember-CLI 服务?

如何在 ember-cli 插件组件中找到 npm 模块

如何使用 Ember CLI 正确生成资源和路由

如何在 Ember CLI 应用程序中访问 Ember 全局“App”变量?

如何使用 Ember CLI 进行生产就绪构建?