建立我的第一個HAPI api後端,並遇到奇怪的事情。當我第一次點擊一個端點時(GET/api/item/{name},我可以在控制檯看到處理函數正在運行(mongo查詢),然後發送回覆(有響應插件)如果我用另一個參數再次觸發端點,我會看到第一個調用的響應馬上就會結束,然後處理函數被觸發,而事實上,客戶端變得相同。響應從第一個呼叫HAPI回覆正在發送處理程序之前的後續調用
而且我什至不知道什麼是最有用的,張貼在這裏了
這裏的大部分入口點的JS(缺少配置環境和溫斯頓):
const Hapi = require('hapi');
server = new Hapi.Server();
var mongo_connect = 'mongodb://' + options.mongo_creds + options.mongo_host + ':' + options.mongo_port + '/' + options.mongo_db;
const dbOpts = {
url: mongo_connect,
settings: {
poolSize: options.mongo_pool
},
decorate: true
};
server.connection({ port: options.server_port });
var routes = require('./routes');
if (options.env === "dev") {
server.on('response', function (request) {
winston.log('verbose', `[launch_api] ${request.info.remoteAddress}: ${request.method.toUpperCase()} ${request.url.path} --> ${request.response.statusCode}`);
});
}
server.register({
register: require('hapi-mongodb'),
options: dbOpts
}, function(err) {
if (err) {
winston.log('error', "[launch_api] Unable to register db pool");
throw err;
}
server.route(routes);
server.start(function(err) {
if (err) {
throw err;
}
winston.log('info', `[launch_api] Server running at: ${server.info.port}`);
});
});
條
路線都在路由文件夾中的index.js拉在一起,但每個文件有看起來類似:
'use strict';
var controller = require('../controllers/item-controller')
// Routes for Item
module.exports = [
{
method: 'POST',
path: '/api/item',
config: controller.create
},
{
method: 'GET',
path: '/api/items',
config: controller.fetchAll
},
{
method: 'GET',
path: '/api/item/{name}',
config: controller.find
}
];
所有控制器看起來像這樣(只顯示爲簡潔的查找功能,因爲這已經長)
const Boom = require('boom');
const Joi = require('joi');
const Item = require('../models/item');
module.exports = {
find: {
handler: function(request, reply) {
Item.initFromName(request.params.name).then(function(newItem) {
if (newItem == null) {
reply(Boom.notFound());
}
else {
reply(newItem);
}
}, function(err) {
reply(Boom.badImplementation());
});
}
}
}
最後,模型往往遵循這個,呃,模型(同樣,切出所有原型的擴展,並且只保持一類的功能在這條航線)
const deferred = require('deferred')()
const winston = require('winston');
const collection_name = "items";
var Item = function() {
this.name = "";
this.description = "";
};
// private
function fillFromDB(obj, record) {
obj._id = record._id;
obj.name = record.name;
obj.description = record.description;
}
// Constructor
module.exports.init = function() {
return new Item();
};
module.exports.initFromName = function(name) {
var item = new Item();
const db = server.mongo.db;
db.collection(collection_name).findOne({name: name}).then(function(opResult) {
winston.log("debug","Item.loadFromName opResult is: " + opResult);
if (opResult != undefined) {
winston.log("debug","Item.loadFromName opResult json is: " + JSON.stringify(opResult));
fillFromDB(item, opResult);
deferred.resolve(item);
}
else {
winston.log("debug","Resolving with null");
deferred.resolve();
}
}, function(err) {
winston.log("error", "Item.loadFromName mongo error: " + err);
deferred.reject();
});
return deferred.promise;
};
所有這一切,如果我用捲曲命名我的端點爲而不是,那麼我會得到404的預期結果。如果我再與該是出了名打,我仍然得到404
此輸入:
$ curl -X GET http://192.168.99.100:3000/api/item/not_here
{"statusCode":404,"error":"Not Found"}
$ curl -X GET http://192.168.99.100:3000/api/item/here
{"statusCode":404,"error":"Not Found"}
產生此日誌:
debug: Item.loadFromName opResult is: null
debug: Resolving with null
verbose: [launch_api] 192.168.99.1: GET /api/item/not_here --> 404
verbose: [launch_api] 192.168.99.1: GET /api/item/here --> 404
debug: Item.loadFromName opResult is: [object Object]
debug: Item.loadFromName opResult json is: {"_id":"58b622908ea4d1cee2f46462","name":"here","description":"this item is here"}
需要注意的是相反的方向工作,太。如果我停止並啓動節點,然後用存在的名稱命中端點,則所有後續調用將返回相同的對象。我無法弄清楚這個緩存在哪裏發生。
總結你的問題,hapi似乎是緩存響應? –
是的,我應該說,呃? tl; dr :)但是我沒有做任何我可以看到的啓用緩存的功能,而且我認爲我看到了我正在掃描的一個catbox tuts,它必須被明確啓用。 – gbryant
item變量來自initFromName函數在哪裏?這可能導致問題,也是什麼是緩衝庫?使用回覆界面時,承諾需要正確包裝。 –