我正在尝试创建一个NodeJS服务器或类似于模拟REST API的东西,该API读取JSON文件并响应具有该数据的请求。我真的只需要支持GET请求。最好的方法是什么?
这是我到目前为止所拥有的:
/**
* Sample items REST API
*/
function ItemsRepository() {
this.items = [];
}
ItemsRepository.prototype.find = function (id) {
var item = this.items.filter(function(item) {
return item.itemId == id;
})[0];
if (null == item) {
throw new Error('item not found');
}
return item;
}
/**
* Retrieve all items
* items: array of items
*/
ItemsRepository.prototype.findAll = function () {
return this.items;
}
/**
* API
*/
var express = require('express');
var app = express();
var itemRepository = new ItemsRepository();
app.configure(function () {
// used to parse JSON object given in the body request
app.use(express.bodyParser());
});
/**
* HTTP GET /items
* items: the list of items in JSON format
*/
app.get('/items', function (request, response) {
response.json({items: itemRepository.findAll()});
});
/**
* HTTP GET /items/:id
* Param: :id is the unique identifier of the item you want to retrieve
* items: the item with the specified :id in a JSON format
* Error: 404 HTTP code if the item doesn't exists
*/
app.get('/items/:id', function (request, response) {
var itemId = request.params.id;
try {
response.json(itemRepository.find(itemId));
} catch (exception) {
response.send(404);
}
});
app.listen(8080); //to port on which the express server listen
我知道我会使用以下内容来包含该文件,我只是不知道如何将数据填充到Items中。
var responseItemsData = require('./items-list.json');
答案 0 :(得分:1)
这在节点中是微不足道的。您可以直接要求.json
文件
var responseData = require('./my-json-file'); //.json extension optional
//Do this during your startup code, not during the request handler
然后发送它:
res.write(JSON.stringify(responseData));
您需要的其余代码几乎可以在网络上的每个node.js教程中使用。
答案 1 :(得分:0)
你可以使用jasmine + sinon:
var Episode = Backbone.Model.extend({
url: function() {
return "/episode/" + this.id;
}
});
beforeEach(function() {
this.server = sinon.fakeServer.create();
});
afterEach(function() {
this.server.restore();
});
it("should fire the change event", function() {
var callback = sinon.spy();
this.server.respondWith("GET", "/episode/123",
[200, {"Content-Type": "application/json"},'{"id":123,"title":"Hollywood - Part 2"}']);
var episode = new Episode({id: 123});
// Bind to the change event on the model
episode.bind('change', callback);
// makes an ajax request to the server
episode.fetch();
// Fake server responds to the request
this.server.respond();
// Expect that the spy was called with the new model
expect(callback.called).toBeTruthy();
expect(callback.getCall(0).args[0].attributes)
.toEqual({id: 123,
title: "Hollywood - Part 2"});
});
更多详细信息:https://github.com/cld-santos/simplologia/tree/master/javascript-lessons/src/test/javascript/Sinon
答案 2 :(得分:0)
最简单的方法是简单地使用静态中间件。
var express = require('express');
var app = express();
app.use('/api', express.static(__dirname + '/data'));
app.use('.*', express.static(__dirname + '/assets'));
这假设您最终将REST api放在/ api,但是当您测试数据时,将在data
目录中并且您的CSS / JS / HTML位于资产文件夹。实际上你可以把它放在任何你想要的地方,但你现在可以将你所有的dev json与你的代码分开。
答案 3 :(得分:0)
我为此创建了一个工具 https://github.com/homerquan/kakuen