node.js - 第一个请求返回空白,第二个请求返回数据

时间:2015-08-13 04:20:46

标签: javascript mysql node.js

我正在使用express,body-parser和mysql设置node.js api。

每当我第一次向路线发出获取请求时,我都会得到空白回报。如果我第二次开火,我会得到理想的回报。

这是基本设置......

server.js

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

// include the model
var Tasks = require('./models/tasks.js');


// configure api to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080;        

var router = express.Router();           

// middleware to use for all requests
router.use(function(req, res, next) {


    // do logging
    //console.log(req)
    next(); // make sure we go to the next routes and don't stop here
});

router.route('/tasks')

// on routes that end in /tasks/:task_id
// ----------------------------------------------------
router.route('/tasks/:task_id')

    // get the task by id (accessed as GET)
    .get(function(req, res) {
        Tasks.setProjectId(req.params.task_id);
        Tasks.setResult(req.params.task_id);

        var tasks = Tasks.getTasksByProjectId();

        res.json(tasks);

    });


app.use('/v1', router);

// START THE SERVER
app.listen(port);
console.log('Magic happens on port ' + port);

这里是tasks.js

// include the db
require('../db.js');

var project_id, result;

module.exports.setProjectId = function(pid) {
    project_id = pid;
}

module.exports.setResult = function(pid) {
    //connection.connect();
    connection.query('SELECT * FROM tasks WHERE project_id = ' + pid, function(err, rows, fields) {
        if (err) throw err;
        result = rows;
    });
    //connection.end();
}

module.exports.getTasksByProjectId = function(){
    return result;
}

为什么第一次请求时空白返回的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

异步,异步,异步。

您正在尝试基于异步操作设置模块全局,这将在未来完成一些不确定的时间。

但是,在异步操作完成之前,您正在尝试读取结果。所以,模块全局仍然是空的。

当您发出第二个请求时,第一个请求已经完成,您将看到第一个结果。

您正在使用的整个模型根本不起作用。您不能发出异步请求,但尝试同步使用它们。它根本不会那样工作。

所有异步操作的结果只能在异步操作完成时调用的回调中可靠地使用。没有结果填充到全局变量中,因为您对操作何时完成并且读取全局变量是安全的ZERO。

.setResult()需要接受一个回调函数,你可以在结果准备就绪时调用它,你可以将结果传递给回调函数。这就是你得到结果的地方。你不要将它填充到全局模块中。

答案 1 :(得分:0)

您的全局变量

var result

尝试保存执行的mysql语句中的值。但是你必须记住Node中的所有代码都是异步的。编写的代码试图模仿async,但不是async out-of-box。用简单的话说,你已经完成了代码分离/重构代码,没什么。不要这样做,而是制作代码

setResult

等待异步接受返回值。给它一个回调参数。快乐的编码!