Nodejs,expressjs - 如何提供延迟响应

Posted

技术标签:

【中文标题】Nodejs,expressjs - 如何提供延迟响应【英文标题】:Nodejs, expressjs - how to serve delayed response 【发布时间】:2015-03-01 23:14:13 【问题描述】:

我正在构建一个 web 服务,为此我使用 nodejs、phantomjs 和 expressjs。这三个我都在学习。

我想在处理客户的查询后向他们提供延迟响应。比如,

我正在处理来自我的客户的某些输入,然后,我想在后端处理数据,平均需要大约 10 秒。然后我想将此页面提供给客户。

是否可以在节点中对同一个请求发送多个响应或延迟响应,以便模板自动更新内容。

或者,我是否应该使用相同的方法,例如将 json 存储在服务器中的文件中,然后使用 ajax 提供页面,该页面将查询页面。

请帮助我。这是我写的代码,

app-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 输出存储到文件中,然后使用 ajax 进行查询?或者是否可以直接将json对象更新到客户端?

谢谢

【问题讨论】:

【参考方案1】:

这不是 HTTP 的工作方式。客户不会期待的。这与 Node 或任何其他框架无关。做你正在尝试的方法是实际发送一个正在加载的响应,然后有一些其他机制来报告状态。

例如,您可以设计一个 RESTful API。在那个 RESTful API 中,您可以定义一个端点来创建新事物:

POST /api/things

客户端会向其发布数据以创建新事物。响应应该是提供新创建资源的位置的东西,例如到/api/things/1 的 HTTP 301。

如果用户转到 /api/things/1 并且事情还没有完成,那么您可以临时重定向 (303) 到 /api/things/1/status,它提供了一些有用的状态信息,或者只是发出 404。

如果您真的想发回服务器端推送的状态信息,那么您应该查看 WebSockets 或某种纯 Socket API,Express 都没有提供这两种 API,但 Node 中都提供了这两种 API (查看socket.io 库和net 核心库)

【讨论】:

@Paul >这不是 HTTP 的工作方式。您能否指出相关的规范/ rfc 以供进一步阅读?提前致谢。 @ManasJayanth w3.org/Protocols/rfc2616/rfc2616.html。特别注意该语言指定每个请求都会得到响应这一事实。上面的问题询问每个请求的多个响应。它还谈到了延迟响应,这当然是可能的,但存在触发超时的风险,因此最好使用 websockets 或轮询。

以上是关于Nodejs,expressjs - 如何提供延迟响应的主要内容,如果未能解决你的问题,请参考以下文章

通过 NodeJS 获取 JSON 数据时,如何通过 ExpressJS 更新我的 EJS 模板?

刷新页面显示找不到文件错误如何使用 [angular js + NodeJS/ExpressJS] 解决

如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?

NodeJS ExpressJS - 如何记录生产服务器的错误?

我们如何使用带有 expressjs-nodejs 的 mongoose 对 mongodb 中的 ObjectId 列执行排序?

为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流