javascript - Nodejs、expressjs - 如何提供延迟响应

标签 javascript jquery ajax json node.js

我正在构建一个网络服务,为此我使用了 nodejs、phantomjs 和 expressjs。我正在学习所有这三个。

我想在处理完查询后向客户提供延迟响应。例如,

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

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

或者,我是否应该使用相同的方法,比如将 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);

路由器.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。

另外,我是否必须将处理后的lib输出的json存储到一个文件中,然后使用ajax进行查询?或者是否可以直接将 json 对象更新到客户端?

谢谢

最佳答案

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

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

POST/api/东西

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

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

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

关于javascript - Nodejs、expressjs - 如何提供延迟响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27762205/

相关文章:

javascript - 在 JavaScript 中混合原型(prototype)和构造函数模式时出现类型错误

javascript - 如何让 jQuery 实时搜索在 javascript 数组中更准确?

jquery - Chrome 和 safari 中自定义日期选择器的问题

javascript - 使用 jQuery 验证插件 1.11.1 动态添加/删除具有数据属性的表单验证

javascript - 修改jquery $.get函数响应

javascript - AJAX 创建的项目不响应 jQuery 选择器

javascript - 从下拉列表中选择路径元素的值时,如何更改路径元素的颜色

javascript - 如何提高 nodejs/socket io 性能?

javascript - 即使 JS 条件为真,jsp 页面也会重定向到下一页

mysql - codeigniter 表单验证和 ajax 查找以查看名称是否存在