Как использовать собственный сервер Express с Ember CLI?

Я использую Ember CLI 0.0.36. Когда я запускаю ember server в папке моего проекта, я понимаю, что запускается сервер, спрятанный в каком-то процессе Brocoli. Однако я хотел бы запрограммировать собственный сервер Express, чтобы мое приложение указывало на этот код Node.js для его бэкэнда. Как мне это сделать в среде командной строки Ember?

ОБНОВИТЬ:

После ответа @user3155277 я добавил файл адаптера следующим образом:

имя-приложения/приложение/адаптеры/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 мой индексный маршрут определяется так:

имя-приложения/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

person cwarny    schedule 20.06.2014    source источник
comment
Ember-cli работает так быстро, однако 0.0.39 делает это менее болезненным. Сгенерируйте API-заглушку из командной строки и бум. вам просто нужно var express = require('express') но в 0.0.40 тоже не будет. У меня были те же проблемы с API-заглушками до   -  person elrick    schedule 16.07.2014
comment
Привет @elrick, я ждал выхода 0.0.40, но я все еще не совсем понимаю, как все это настроить. Не могли бы вы привести пример?   -  person cwarny    schedule 29.07.2014


Ответы (2)


На самом деле это довольно просто с 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 (через этот PR) api-stub было переименован в http-mock.

person cwarny    schedule 07.08.2014
comment
Начиная с Ember CLI 0.0.41 (через этот PR) api-stub был переименован http-mock. - person Duncan Walker; 02.09.2014
comment
Обратите внимание, из документации ember-cli: Note: Mocks are just for development and testing. The entire /server directory will be ignored during ember build. - person neverfox; 31.12.2014
comment
Используют ли люди Mirage сейчас для тестирования? - person TheOkayCoder; 13.03.2019

Я начал играть с 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 namespace - заполните созданный файл следующим кодом:

экспорт по умолчанию DS.RESTAdapter.reopen({ namespace: 'api' });

3. Запустите сервер с ember serve --proxy http://localhost:1337/ (это проксирует все ваши запросы на localhost: 4200 до 1337).

4. Создавайте маршруты в своем экспресс-приложении с префиксом /api.

Надеюсь, поможет

person barczag    schedule 26.06.2014
comment
Спасибо. Попробуем и сообщим, как пойдет. Но до этого, и это может быть глупый вопрос, знаете ли вы, как с этим справиться при запуске производства? Использование прокси звучит как взлом. - person cwarny; 27.06.2014
comment
Я попытался реализовать ваши предложения. Смотрите мой отредактированный вопрос с проблемами, с которыми я столкнулся. - person cwarny; 27.06.2014
comment
Пожалуйста, попробуйте использовать последнюю версию, используя 0.0.37. Для вопроса о взломе этот обходной путь прокси предназначен только для разработки, вы должны использовать файлы в каталоге dist для рабочего сервера, обслуживаемого вашим экспресс-приложением. - person barczag; 27.06.2014
comment
Я сделал аналогичный пакет сборки для использования серверной части Node, а не Rails. Я использую прокси во время разработки, но это в продакшене (который ничего не проксирует). github.com/andrewbranch/heroku-buildpack-nodejs-ember - person Andrew; 29.03.2015