Node.js异步处理http请求

时间:2014-08-20 13:57:06

标签: express

我是Node.js的新手,试图学习它并且我对我的问题感到困惑。 问题是如下。我正在尝试使用页面构建一个简单的项目(使用Express),它将显示用户列表,该列表存储在MongoDB中。

这是我的路由器:

var express = require('express');
var router = express.Router();
var userRepository = require('../repositories/user_repository.js');

router.get('/:long?', function(req, res) {
    var long = req.param('long');
    long = !!long;
    userRepository.getAllUsers(function(users) {
        res.render('index', {
            users: users
        });
    }, long);
});

module.exports = router;

让我解释一下这个想法。 这是http://mywebsite.com/ url的处理程序,它也可以有一个可选参数(http://mywebsite.com/?long=something)。该参数被转换为布尔类型并传递给userRepository的tge getAllUsersMethod。

这是我的userRepository:

var db = require('../context').db;

var userRepository = {
    getAllUsers: function(callback, long) {
        var now = Date.now();
        var then = now + 5000;
        if (long) {
             while (Date.now() < then) {}
        }
        db.users.find({}, function(err, users) {
            callback(users);
        });
    }
};

module.exports = userRepository;

getAllUsers()函数的逻辑取决于'long'参数。如果它是假的,它只需要用户列表形成我的数据库。如果long = true,则sleeps持续5秒,然后才从数据库中提取数据。

当我输入网址时:http://mywebsite.com/然后是long = false,我会立即看到我的用户列表。

当我输入网址时:http://mywebsite.com/?long=something然后long = true,并且网页按预期加载~5秒。

然后我尝试执行以下操作。我正在输入:http://mywebsite.com/?long=something,然后在另一个标签中输入:http://mywebsite.com/。第一个选项卡按预期加载5秒,但问题是第二个选项卡也等待5秒,直到加载第一个选项卡,然后才加载。这意味着,请求不是异步处理的。有了这个'睡眠',我试图模拟情况,当数据库请求需要花费很多时间来处理。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

有了这个&#39;睡眠&#39;我试图模拟情况,当数据库请求将花费大量时间来处理。

     

我做错了什么?

不要sleep。这就是你做错了什么。

您的JavaScript在单个线程中运行。如果通过休眠阻塞线程,则Node.js无法继续。如果要模拟需要时间的异步操作,请使用setTimeout代替回调。