2015-08-13 172 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 

等待異步接受返回值。給它一個回調參數。快樂的編碼!