2016-01-11 67 views
1

我目前正在開發Express js API。我想寫一個函數來將分析保存在數據庫中,但我應該能夠在火中調用函數並忘記方法。該函數應該接受參數並完成其工作。這應該像一個單獨的線程一樣工作,並且當前的代碼執行不應該等待它的響應。例如Akka Actors在Java中的工作方式。有人可以提出一種方法來做到這一點或一些鏈接來引用?ExpressJs(NodeJs)Fire&Forget

回答

1

您可以將您的信息添加到某種MessageQueue中,然後啓動另一個將偵聽MQ並相應處理消息的進程。

演員的工作方式並不特別,但這就是通常在nodejs領域完成的方式。

例如,你可以使用kueAWS SQSGoogle PubSub或任何其他可用的解決方案

// example with kue 
// http-process.js 
var kue = require('kue'); 
var queue = kue.createQueue(); 

... 
app.post('/something-somewhere', (req, res) => { 
    var job = queue.create('event', { 
    data: 'analytics, data', 
    median: 5.3, 
    }).save(function(err){ 
    if(!err) return next(err); 

    res.send('ok'); 
    }); 
}); 

// event-processor.js 
var kue = require('kue'); 
var queue = kue.createQueue(); 

queue.process('event', function(job, done){ 
    someKindOfORM.myEventsTable.insert({ 
    job.data 
    }).notify(done); 
}); 
+0

哦,這是一個不錯的解決方案。但是你認爲Promises能夠以某種方式幫助我嗎?我對承諾不熟悉。只是問問。 –

+0

我以爲那裏還有阿卡的諾言概念,不是嗎?基本上,承諾是如何處理您的同步代碼的方式。我現在將爲你添加樣本 –

+0

@SagarGopale這裏是理解承諾的好教程http://www.html5rocks.com/en/tutorials/es6/promises/。 Promise並不是要在單獨的過程中運行,但它們旨在簡化異步代碼的過程。在您首先經歷回調 - 地獄之前,很難解釋 –

2

節點是默認異步。只需在db查詢回調之外發送回復:

app.get("/ping", function (req, res) { 
    // fire 
    dbConnection.query("UPDATE analytics SET count = count + 1", function(err, result) { 
     // forget 
    }); 

    res.send("Pong"); 
}); 
+0

我相信他希望在處理錯誤時擁有更多的空間;使用MQ的允許他重試數據庫插入,如果它失敗,甚至做一些預處理 –

+1

@VladMiller在這個簡單的方法仍然有空間來處理錯誤。 –