2014-10-23 2 views
1

Я написал API, который запрашивает базу данных MySQL и выводит соответствующие результаты для посещения URL-адреса. Это код:Обновление содержимого Express NodeJS API

//server.js 
var express = require('express'), 
    mysql = require('mysql'), 
    app  = express(), 
    connectionpool = mysql.createPool({ 
     host  : 'localhost', 
     user  : 'root', 
     password : 'password', 
     database : 'database' 
    }); 

app.get('/:transcript', function(req,res){ 
    var var1 = req.param('transcript'); 
    exports.var1 = var1; 
    var queries = require('./queries'), 
     query1 = queries.query1; 
    //Connection to MySQL 
    connectionpool.getConnection(function(err, connection) { 
     if (err) {res.send({result: 'error connection'})} 
     connection.query(query1, function(err, rows) { 
      if (err) {res.send({result: 'error query1'})}; 
      counter = 0; root = {}; 
      rows.forEach(function (row) { 
       build_actor(row.Transcript_alias, function(exprobject1) { 
        counter += 1; 
        //Defining and filling objects 
        main = {}; 
        main.Official_transcript_name = row.Transcript_name; 
        main.Expression = exprobject1; 
        root[row.Transcript_alias] = main; 
        if (counter == rows.length) { 
         res.write(JSON.stringify(root, null, '\t')); 
         res.end(); 
        } 
       }); 
      }); 
      connection.release(); 
     }); 
     //CallBack 
     function build_actor(transcript, callback) { 
      //Other, secondary queries: 
      var query2 = 'SELECT * FROM expression WHERE transcript_alias = "' + transcript + '";', 
      connection.query(query2, function(err, rows1) { 
       if (err) {res.send({result: 'error query2'})} 
        var exprobject2 = {}, 
         exprobject1 = {}; 
        for (i = 0; i < rows1.length; i++) { 
         Conditions = rows1[i].conditions; 
         Tissue = rows1[i].tissue; 
         FPKM = rows1[i].FPKM; 
         exprobject2[Tissue] = FPKM; 
         if (Conditions in exprobject1) { 
          exprobject1[Conditions].push(exprobject2); 
         } else { 
          exprobject1[Conditions] = []; 
          exprobject1[Conditions].push(exprobject2); 
         } 
        } 
        callback(exprobject1); 
      }); 
     } 
    }); 
}); 

app.listen(3000); 
console.log('Listening on port 3000'); 

Этот сценарий вызывает нужный файл, где есть мои запросы:

//queries.js 
var server = require('./server'), 
    query1 = 'SELECT distinct(transcript_alias)\ 
     FROM transcript_features \ 
     WHERE f.transcript_alias = "' + var1 + '";'; 

exports.query1 = query1; 

Я иду к содержанию этого сценария следующим образом:

http://localhost:3000/AC149829.2_FGT004 
http://localhost:3000/AC148152.3_FGT007 

Когда Сначала я посещаю http://localhost:3000/AC149829.2_FGT004, API показывает правильные результаты для переменной AC149829.2_FGT004. Однако при изменении переменной на AC148152.3_FGT007 она продолжает показывать информацию для переменной AC149829.2_FGT004. Чтобы увидеть результаты для AC148152.3_FGT007, я должен убить сценарий, повторить его и впервые посетить http://localhost:3000/AC148152.3_FGT007. В заключение результаты не обновляются.

Как это? Я попытался с простой:

app.get('/:transcript', function(req,res){ 
    var input = req.param('transcript'); 
    res.send(input); 
}); 

, но она хорошо работает ...

EDIT. Я нашел источник своей проблемы. query1 всегда то же самое. Сценарий звонит только один раз:

exports.var1 = var1; 
var queries = require('./queries'), 
    query1 = queries.query1; 

Есть ли способ преодолеть это ограничение?

ответ

0

Я нашел решение для своей проблемы. Как

//server.js 
exports.var1 = var1; 
var queries = require('./queries'), 
    query1 = queries.query1; 

выполняется один раз и остается в кэше, я изменил код без экспорта var1:

//server.js 
var queries = require('./queries'), 
    query1 = queries.query1 + var1; 

и

//queries.js 
var server = require('./server'), 
    query1 = 'SELECT distinct(transcript_alias)\ 
     FROM transcript_features \ 
     WHERE f.transcript_alias = '; 

exports.query1 = query1; 

Другими словами, я импортировать мой запрос server.js без какой-либо переменной. Переменная назначается на server.js.