我正在使用Ember CLI 0.0.36。当我在项目文件夹中运行ember server
时,我的理解是埋在一些Brocoli进程中的服务器开始运行。但是,我想编写一个自定义Express服务器,并让我的应用指向其后端的Node.js代码。我将如何在Ember CLI框架内进行此操作?
更新:
在@user3155277's answer之后,我添加了一个类似的适配器文件:
应用名称/应用/适配器/ application.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
答案 0 :(得分:19)
这实际上非常简单,使用Ember CLI 0.0.40:
创建文件夹结构
ember new my-app
进入新创建的文件夹
cd my-app
生成api-stub *(参见更新)
ember generate api-stub my-server
后一个命令会创建一个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);
};
然后您需要做的就是更改该文件。如果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
。
答案 1 :(得分:3)
我开始玩ember cli所以我不确定但是我发现了以下内容: https://github.com/dockyard/ember-cli-plus-backend/tree/rails-served-html/frontend/api-stub 基本上你应该将你的快速服务器代理到与ember-cli相同的端口(这样你就不用处理jsonp问题了)
将方法设置为“proxy”并定义proxyURL以将所有API请求传递给代理URL。
更新:
1.生成适配器ember generate adapter application
2.使用api命名空间 - 使用以下代码填充创建的文件:
export default DS.RESTAdapter.reopen({ 命名空间:'api' });
3.使用ember serve --proxy http://localhost:1337/
启动服务器(这会将您的所有请求代理到localhost:4200到1337
4.使用/ api
前缀的快速应用程序中的路线希望有所帮助