2015-10-19 23 views
1

直接從this post帶restify的簡單藍鳥示例不起作用

此代碼從不執行。

var Promise = require("bluebird"); 
Promise.promisifyAll(require("restify")); 
var restify = require("restify"); 

var http = require('http'); 

const PORT=7070; 


function handleRequest(request, response){ 
    response.end('It Works!! Path Hit: ' + request.url); 
} 

var server = http.createServer(handleRequest); 

server.listen(PORT, function(){ 
    console.log("Server listening on: http://localhost:%s", PORT); 
}); 


var client = restify.createJsonClientAsync({ 
    url: 'http://127.0.0.1:7070' 
}); 

client.get("/foo").spread(function(req, res, obj) { 
    console.log(obj); 
}); 

我只把這個簡單的例子放在一起,以證明我的生產代碼沒有工作後,我自己。我可以用curl命中localhost:7070,並獲得預期的結果。

簡而言之:在創建POST之前,我需要執行3次GET調用,因此我需要承諾。

任何人都可以發現一些見解?我無法想象這更簡單。

+0

應該有一個錯誤,你不得到任何? – Bergi

+0

創建客戶端應該是同步的。獲取路徑響應應該是異步的。 – Bergi

+0

我不認爲你應該promisify restify。您可以在處理程序中提供代碼,或者您可以鏈接處理程序並在每個處理程序上調用以移至下一個處理程序 – vbranden

回答

0

UPDATE

顯然我沒有正確讀取的問題,這裏是2的工作示例被使用promisified的RESTify JSON客戶端。你只需在第二次傳播的內容中爲你的帖子做另一次傳播。

var promise = require('bluebird'); 
var restify = require('restify'); 
promise.promisifyAll(restify.JsonClient.prototype); 
var client = restify.createJsonClient({ 
    url: 'http://localhost:8080', 
    version: '*' 
}); 


client.getAsync('/api/resource/1').spread(function(req, res, obj) { 
    console.log('result 1', obj); 

    return client.getAsync('/api/resource/2').spread(function(req, res, obj) { 
     console.log('result 2', obj); 
    }); 
}); 

正如我在我的評論中指出的那樣,我不會讓自己滿意。相反,我會使用一個處理程序的身體執行承諾代碼或一個處理程序鏈(它也可以在體內承諾)。 restify應該只接收請求並執行處理程序。

我將使用restify頁面中基本示例的修改版本來說明每個。

承諾在郵件正文中使用knex.js它返回一個承諾

var knex = require('knex')(connectionConfig); 
var restify = require('restify'); 

function promisePost(req, res, next) { 
    // get 1 
    knex.select('*') 
    .from('table1') 
    .where('id', '=', req.body.table1_id) 
    .then(function(result1) { 
     // get 2 
     return knex.select('*') 
     .from('table2') 
     .where('id', '=', req.body.table2_id) 
     .then(function(result2) { 
      return knex('table3').insert({ 
       table1_value: result1.value, 
       table2_value: result2.value 
      }) 
      .then(function(result3) { 
       res.send(result3); 
       return next(); 
      }); 
     }); 
    }); 
} 

var server = restify.createServer(); 
server.use(restify.bodyParser()); 
server.post('/myroute', promisePost); 

server.listen(8080, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

現在鏈結的處理程序

var knex = require('knex')(connectionConfig); 
var restify = require('restify'); 

function get1(req, res, next) { 
    knex.select('*').from('table1') 
    .where('id', '=', req.body.table1_id) 
    .then(function(result1) { 
     res.locals.result1 = result1; 
     return next(); 
    }); 
} 
function get2(req, res, next) { 
    knex.select('*').from('table2') 
    .where('id', '=', req.body.table2_id) 
    .then(function(result2) { 
     res.locals.result2 = result2; 
     return next(); 
    }); 
} 

function post(req, res, next) { 
    knex('table3').insert({ 
     table1_value: res.locals.result1, 
     table2_value: res.locals.result2 
    }) 
    .then(function(result3) { 
     res.send(result3); 
     return next(); 
    }); 
} 

var server = restify.createServer(); 
server.use(restify.bodyParser()); 
server.post('/myroute', get1, get2, post); 

server.listen(8080, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 
+0

我懷疑這就是你的意思。我可以看到,我的起源問題並不清楚,它是需要有前途的客戶。但是,你關於服務器的例子確實給了我一些想法。謝謝 –

相關問題