2016-11-09 2 views
1

Я пытаюсь использовать connection из connection.js файла и использовать его в другом файле webFrontend.js с помощью exports объекта. Теперь то, что я получаю на котором работает сервер является:Почему это соединение не определено?

{ 
    "Result": "undefinedThis is result" 
} 

Это означает, что connection не определен. Почему это происходит? connection работает нормально, если getConnection создается в том же (webFrontend.js) файла, но проблема в том, когда я использую getConnection в той же функции экспорта в connection.js отсюда connection не определена ошибка:

Вот 2 необходимые файлы (маршруты файл не имеет никаких проблем), что объясняет то, что я делаю:

connection.js

var mysql = require('mysql'); 
exports.connExport = function() { 
    var connectionPool = mysql.createPool({ 
     host: 'localhost', 
     user: 'root', 
     password: '', 
     database: 'rockcity_followme' 
    }); 
    if(connectionPool) { 
     connectionPool.getConnection(function (err, connection) { 
      if (err) { 
       return err; 
      } else { 
       return connection; 
      } 
     }); 
    }else{ 
     var abc="return error"; 
     return abc; 
    } 
} 

webFrontend.js

var connObj=require('../Routes/connection.js'); 
var connection=connObj.connExport(); 
exports.getIndivRecords= function(req, res, next){ 
res.send({ 
    Result: connection+"This is result" 
}); 
    return next(); 
}; 
+1

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-a-асинхронный вызов) – JJJ

+0

Я не понимаю, что у него есть в моем вопросе? –

+0

'connectionPool.getConnection' является асинхронной функцией. Почему вы думаете, что у него есть параметр обратного вызова? – JJJ

ответ

0

Нет необходимости расширения файла .js, он автоматически добавляется для вас.

Приведенный ниже код использует стандартные ошибки-первых обратных вызовов

webFrontend.js

var connection = require('../Routes/connection'); 
exports.getIndivRecords = function(req, res, next){ 

    // connection takes a standard error-first callback 
    connection(function(err, conn){ 
    if (err) { 
     // Handle the error returned 
     console.log(err); 
    } 
    // The database connection is available here as conn 
    console.log("Connection:" + conn); 

    // presumably you want to do something here 
    // before sending the response 

    res.send({ 
     Result: conn + "This is result" 
    }); 
    }); 
    return next(); 
}; 

connection.js

var mySQL = require('mysql'); 
var connectionPool = mySQL.createPool({ 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'rockcity_followme' 
}); 
var getConnection = function (cb) { 
    connectionPool.getConnection(function (err, connection) { 
    // pass the error to the callback 
    if (err) { 
     return cb(err); 
    } 
    cb(null, connection); 
    }); 
}; 
module.exports = getConnection; 
+0

Помогло бы? –

+1

Это не отвечает на мой вопрос. –

+0

Изменен мой ответ с обратным вызовом для подключения –

0

Прежде всего @Dan Нэгла был прав нет требуется .js

Second Вы получаете соединение undefinded, потому что все еще метод не возвращается с результатом.

Используйте обещание назвать ваш метод Connection.js

Вашего узла однопоточно выполнение асинхронным, Он делает ждать метода возвращает результат

1) Проблема с JavaScript, что

var connection=connObj.connExport(); 

в Creation этапе connection был определен JavaScript как неопределенные и, как connObj.connExport();, как до сих пор не вернулся с ответом он выполнил эту функцию, в которой соединение было не определено

exports.getIndivRecords= function(req, res, next){ 
res.send({ 
    Result: connection+"This is result" 
}); 

Используйте обещание прочитать это первое, так что вы можете понять что-то о обещании и обратного вызова, если вы не в состоянии решить, чем я комментарий будет играть с it.but первой попытке.Thanku

Understanding promises in node.js

Ok Try This Я использовал обещание здесь

var connObj = require('../Routes/connection'); 
connObj.connExport().then(
    function (connection) { 
     exports.getIndivRecords = function (req, res, next) { 
      res.send({ 
       Result: connection + "This is result" 
      }); 
      return next(); 
     }; 
    }).catch(function (err) { 
    res.status(400).send(err); 
    return; 
}); 




var mysql = require('mysql'); 
exports.connExport = function() { 
    return new Promise(function (fulfill, reject) { 
    var connectionPool = mysql.createPool({ 
     host: 'localhost', 
     user: 'root', 
     password: '', 
     database: 'rockcity_followme' 
    }); 
    if (connectionPool) { 
     connectionPool.getConnection(function (err, connection) { 
      if (err) { 
       return reject(err); 
      } else { 
       return fulfill(connection); 
      } 
     }); 
    } else { 
     var abc = "return error"; 
     return reject(abc); 
     } 
    }); 
} 
+0

Что вы скажете о 2-м ответе? –

+0

Нет, он не прав, он не работает, это неправильный способ обратного вызова –

+0

Можете ли вы отредактировать свой ответ с помощью обратного вызова? –

Смежные вопросы