2015-08-13 121 views
0

我使用express,body-parser和mysql设置node.js api。node.js - 第一个请求返回空白,第二个请求返回数据

每当我第一次获得路线请求时,我都会得到一个空白回报。如果我再次点燃它,我会得到理想的回报。

这是基本的设置...

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

异步,异步,异步。

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

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

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

您正在使用的整个模型将无法正常工作。您不能进行异步请求,但尝试同步使用它们。它不会那样工作。

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

.setResult()需要采取回调函数,您可以在结果准备就绪时调用回调函数,并且可以将结果传递给回调函数。这就是你得到结果的地方。你不会把它塞进全局模块中。

0

你的全局变量

var result 

试图保持从被执行mysql的语句中的值。但是你必须记住Node中的所有代码都是异步的。编写的代码试图模仿像异步,但不是异步开箱即用。简单来说,你已经完成了代码分离/重构代码,而且没有太多。而不是这样做,让你的代码

setResult 

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