2015-01-04 5 views
2

Я создаю веб-сервис, для которого я использую nodejs, phantomjs и expressjs. Я изучаю все три.Nodejs, expressjs - как обслуживать задержанный ответ

Я хочу выполнить отложенный ответ клиентам после обработки их запроса. Например,

Я обрабатываю определенные входы от моего клиента, тогда я хочу обработать данные на бэкэнд, который займет около 10 секунд на avg. Затем я хотел отправить эту страницу клиенту.

Возможно ли в узле отправлять несколько ответов на один и тот же запрос или отложенные ответы, чтобы шаблон автоматически обновлял содержимое.

Или, должен ли я использовать тот же метод, как хранить json в файле на сервере, а затем обслуживать страницу с помощью ajax, который будет запрашивать страницу.

, пожалуйста, помогите мне. Вот код, который я написал,

приложение-server.js (главный файл):

// import express module 
var express = require('express'); 
var bodyParser = require('body-parser'); 
var app = express(); 

// define all required template files to be served and also define the template engine 
app.engine('.html', require('ejs').__express); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'html'); 

// Useful modules 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

// import the routes 
require('./router')(app); 
app.listen(8080); 

router.js:

var crypto = require('crypto'); 
var express = require('express'); 

module.exports = function (app) { 

    // define the static routes. 
    app.use('/static', express.static('./static')); 
    app.use('/media', express.static('./media')); 

    //defining the controller. 
    var parserlib = require('./controller.js') 

    // Define the home root path 
    app.get('/', function (req, res) { 
     // shows the home search page. 
     res.render('index', {content:'template success'}); 
    }); 

    app.get('/search', function(req, res){ 
     res.redirect('/'); 
    }); 

    app.post('/search', parserlib.parserlib); 
} 

controller.js:

var crypto = require('crypto'); 
var path = require('path') 
var childProcess = require('child_process') 

exports.parserlib= function(req, res){ 

    var output = ''; 
    var url = req.body.search_url; 

    var childArgs = [ 
    path.join(__dirname, 'external-script.js'), 
    url, 
    ] 

    // execute the script in a separate thread. 
    childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) { 
     // handle results 
     console.log(stdout); 
     output = stdout; 
     //console.log(err); 
     //res.send(output); 
    }); 
    //res.send(output); 
}; 

Итак, что я хочу видеть, сначала отправьте ответ клиенту, указав, что его загрузка, а затем я хочу обновить обработанные данные. На других языках невозможно отправить несколько ответов. Не уверен в nodejs.

Кроме того, мне нужно сохранить выход json из обработанного lib в файл, а затем использовать ajax для запроса? или можно напрямую обновить json-объект клиенту?

Thanks

ответ

1

Это не так, как работает HTTP. Клиенты этого не ожидают. Это не имеет ничего общего с узлом или любой другой структурой. Способ делать то, что вы пытаетесь, - фактически отправить ответ, который загружается, а затем добавить другой механизм для сообщения состояния.

В качестве примера вы можете создать RESTful API. В этом RESTful API можно определить конечную точку для создания новых вещей:

POST/API/вещи

Клиент будет размещать данные, что для создания новой вещи. Ответ должен быть тем, что обеспечивает местоположение вновь созданного ресурса, например HTTP 301 до /api/things/1.

Если пользователь переходит на /api/things/1 и дело не будет сделано получать сделано еще, то вы можете сделать временный редирект (303) к /api/things/1/status, который обеспечивает некоторую полезную информацию о состоянии, или просто выдать 404.

Если вы действительно хотите отправить обратно на серверную информацию о статусе, то вам следует искать WebSockets или чистый Socket API, какой-либо из которых предоставляется Express, но оба из них доступны в узле (checkout библиотека socket.io и основная библиотека net)

+0

Позвольте мне проверить socket.io.Кажется, он может делать то, что я ожидаю. – Bala

+0

@Paul > Это не так, как работает HTTP. Не могли бы вы указать на соответствующий spec/rfc для дальнейшего чтения? Заранее спасибо. –

+0

@ManasJayanth https://www.w3.org/Protocols/rfc2616/rfc2616.html. в частности, обратите внимание на то, что язык указывает, что каждый запрос встречается с ответом. В приведенном выше вопросе спрашивается о нескольких ответах на запрос. В нем также говорится о задержке ответа, который, безусловно, возможен, но он рискует отключить таймауты и, следовательно, лучше обслуживается с помощью websockets или опроса. – Paul

Смежные вопросы