我一直在尝试为使用yeoman
生成的应用创建api存根。这里没什么特别的,我只是打电话:
mkdir demo1
cd demo1
yo angular
出于开发目的,我需要api存根,到目前为止我发现的唯一模块是lineman。但是,就我所知,lineman不是非常 yeoman-friendly ,所以我所做的是在端口8000
上启动lineman,提供一些api存根(就像文档中的那些) ),并将"grunt-connect-proxy": "~0.1.5"
添加到项目节点模块,然后创建一个代理,将所有localhost:9000/api/*
传递给localhost:8000/api/*
,从而提供存根。
虽然这样做有效,但我想删除有线人依赖关系并自己提供存根。这是我到目前为止编写的代码(添加express
作为路由/参数解析的依赖) - 大多数代码都是bit&来自快递模块的片段,以便将http.ServerRequest
和http.ServerResponse
包裹到快照request
& response
:
// load all grunt tasks
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
var drawRoutes = require('./config/server').drawRoutes;
var express = require('express');
var expressApp = express();
drawRoutes(expressApp);
var router = expressApp._router;
// Provide api stubs through express router functionality.
var apiStubSnippet = function(req, res, next) {
var match = router.matchRequest(req);
if (typeof(match) !== 'undefined') {
// Found a match, invoke it
if (match.callbacks.length > 0) {
var _req = require('express/lib/request');
var _resp = require('express/lib/response');
// Set the two objects together ... but why?!
_req.__proto__ = req;
_req.app = expressApp;
_req.res = _resp;
_resp.__proto__ = res;
_resp.app = expressApp;
_resp.req = _req;
match.callbacks[0](_req, _resp);
}
} else {
// No match on the router, go next.
next();
}
};
此时,调用似乎已解决(控制台中不再出现错误)。但是,电话仍然悬而未决,我不知道如何继续。我很确定代码对于它需要做的事情来说过于复杂,但我是grunt& amp;的初学者。节点模块。
任何帮助都可以,谢谢。
答案 0 :(得分:1)
Angular允许你使用$httpBackend
存根,你试过吗?
我喜欢尽可能打破JS最佳实践,所以这是我今年早些时候为项目做的事情:
app.run(function ($httpBackend) {
var createResponse = function (type, url, status, response) {
var when = $httpBackend.when(type, url);
if (angular.isDefined(status) && angular.isDefined(response))
when.respond(status, response);
return when;
};
String.prototype.get =
RegExp.prototype.get = function (status, response) { return createResponse('GET', this, status, response); };
String.prototype.post =
RegExp.prototype.post = function (status, response) { return createResponse('POST', this, status, response); };
String.prototype.put =
RegExp.prototype.put = function (status, response) { return createResponse('PUT', this, status, response); };
/^\/views\//
.get()
.passThrough();
'/api/login'
.post(200, {
// response object.
});
});
这种特殊的方法可能不是你想要的,但$httpBackend
可能是。
答案 1 :(得分:0)
这两个端口配置为相同的上下文,尝试更改为:localhost:9000 / *和localhost:8000 / api / *。 这些上下文和端口是在Gruntfile中配置的吗?