【问题标题】:NodeJs + Postgres synchronus connection to Database to populate variableNodeJs + Postgres 同步连接到数据库以填充变量
【发布时间】:2014-03-21 16:04:19
【问题描述】:

我正在使用带有 postgreSQL 的 nodeJs express 3 框架,我正在使用下面的脚本在 DB 中查找用户名并填充一个变量,以便我可以将其传递给我的视图。 这是我的脚本:

app.js
var app = express();
app.use(express.bodyParser());
......
function fncCheckUsernameAvailability(vstrUsername){
    var pg = require("pg");
    var client = new pg.Client({user: 'xxx', password: 'xxxx', database: 'xxx', host: 'example.com'});
    var response = "";
    client.connect(function(err) {
  if(err) {
    return console.error('could not connect to postgres', err);
  }
 client.query("SELECT username FROM users WHERE username ='"+vstrUsername+"'", function(err, result) {
    if(err) {
      return console.error('error running query', err);
    }
        if(result.rows[0] == undefined){
            //console.log("Username available");
            response = "Username available";//Populating The variable here
        }else{
            //console.log("Username already taken");
            response = "Username already taken";//Populating The variable here
        }
    client.end();
  });
    });
    return response;
}


app.post("/Signup", function(req, res){
var username = req.body.username;
var Response = fncCheckUsernameAvailability(username);
console.log(Response);
}

响应变量总是“未定义”,那么如何让该脚本等待数据库检查完成以填充“响应”变量?

【问题讨论】:

    标签: node.js postgresql express


    【解决方案1】:

    您不能将返回值放入异步函数中。相反,您需要使用回调,这就是您的代码的样子:

    function fncCheckUsernameAvailability(vstrUsername, callback) {
      client.connect(function(err) {
        if (err) {
          callback(err, null);
          return;
        }
    
        client.query("SELECT username FROM users WHERE username ='" + vstrUsername + "'", function (err, result) {
          client.end();
          if (err) {
            callback(err, null);
            return;
          }
    
          if (result.rows[0] == undefined) callback(null, 'Username available.');
          else callback(null, 'Username taken.');
        });
      });
    };
    

    你可以这样使用函数:

    app.post("/Signup", function(req, res) {
      var username = req.body.username;
      fncCheckUsernameAvailability(username, function(err, result) {
        console.log(result);
      });
    });
    

    【讨论】:

    • err 包含什么?在console.log(result) 之前添加console.log(err) 并发布其中包含的内容。
    • 嗨,很抱歉,我的表名弄错了,现在可以正常使用了,谢谢。
    • 嗨,这是工作 fncCheckUsernameAvailability(username, function(err, result) {console.log(result);}); 它打印在控制台上,但这个 fncCheckUsernameAvailability(username, function(err, result) {myVar = result;}); 不会填充我的变量是不是它也是异步的?
    • 只要变量在回调中,它就会填充变量。如果它为空,那么您可能在某处有错误。
    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2019-11-08
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多